Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Einsteigerfragen
    4. More than 100 subscriptions listed... ?? Woher?

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    More than 100 subscriptions listed... ?? Woher?

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      Mottimuc last edited by

      Hallo zusammen,

      im Log warn mich IOBroker, dass ich ein Script habe, welches > 100 subscriptions haben soll:

      	script.js.CALENDAR_SCRIPTE.Kalender.ICAL_2_LIST_KONVERTER: More than 105 subscriptions registered. Check your script
      

      Ich hatte den Begriff subscription auf "wenn sich Status des Datenpunkt xyz ändert" Verstanden, also ein Überwachen eines Datenpunktes. in Dem Script läuft aber m.E. nach alle 5 Min ein Script, welches aus einem ICAL Feld ein JSON für ein MDW Widget macht...

      ? Was tun?

      Hier das Script

      var schedule1;
      
      // Beschreibe diese Funktion …
      async function tbl_PAPA() {
         
         var instances = $(`[id=ical.5.data.table]`);
         instances.on(ical2TableWidget_0);
         
         // remove this, if you know to use your own datapoint
         let datapointId = '0_userdata.0.Calendar.Kalender.JSON_LIST_MDWCAL_0'
             createState(datapointId, "[]", {
                 read: true, 
                 write: false, 
                 desc: "JSON String for MDW TABLE Widget", 
                 type: "string", 
                 def: "[]"
             });
          
         function ical2TableWidget_0() {
             try {
                 let calList = [];
          
                 for (var inst = 0; inst <= instances.length - 1; inst++) {
                     let icalObj = getState(instances[inst]).val;
          
                     if (icalObj) {
                         for (var i = 0; i <= icalObj.length - 1; i++) {
                             let item = icalObj[i];
          
                             let calendarName = item._class.split(' ')[0].replace('ical_', '');
          
                             // Objekt für Tabelle erzeugen
                             calList.push({
                                 farbe: `<div style="background: ${getMyCalendarColor(calendarName)}; width: 6px; height: 20px"></div>`,
                                 zeit: item.date,
                                 termin: item.event,
                                 kalender: calendarName,
                                 timestamp: Date.parse(item._date)
                             })
                         }
                     }
                 }
          
                 // Liste sort by timestamp asc
                 calList.sort(function (a, b) {
                     return a.timestamp == b.timestamp ? 0 : +(a.timestamp > b.timestamp) || -1;
                 });
          
                 // Enter the destination data point that is to be used as object ID in the widget
                 setState(datapointId, JSON.stringify(calList), true);
          
                 function getMyCalendarColor(calendarName) {
                     // assign colors via the calendar names, use calendar name as set in ical
                      if (calendarName === 'Michael') {
                                 return '#44739e';
                             } else if (calendarName === 'Schiedsrichter') {
                                 return '#008080'
                             } else if (calendarName === 'SCBV') {
                                 return '#5a885d'
                             }
                 }
          
             } catch (e) {
                 console.error(`ical2MaterialDesignTableWidget: message: ${e.message}, stack: ${e.stack}`);
             }
         }
          
         ical2TableWidget_0();
      
      }
      
      // Beschreibe diese Funktion …
      async function tbl_MAMA() {
         
         var instances = $(`[id=ical.6.data.table]`);
         instances.on(ical2TableWidget_1);
         
         // remove this, if you know to use your own datapoint
         let datapointId = '0_userdata.0.Calendar.Kalender.JSON_LIST_MDWCAL_1'
             createState(datapointId, "[]", {
                 read: true, 
                 write: false, 
                 desc: "JSON String for MDW TABLE Widget", 
                 type: "string", 
                 def: "[]"
             });
          
         function ical2TableWidget_1() {
             try {
                 let calList = [];
          
                 for (var inst = 0; inst <= instances.length - 1; inst++) {
                     let icalObj = getState(instances[inst]).val;
          
                     if (icalObj) {
                         for (var i = 0; i <= icalObj.length - 1; i++) {
                             let item = icalObj[i];
          
                             let calendarName = item._class.split(' ')[0].replace('ical_', '');
          
                             // Objekt für Tabelle erzeugen
                             calList.push({
                                 farbe: `<div style="background: ${getMyCalendarColor(calendarName)}; width: 6px; height: 20px"></div>`,
                                 zeit: item.date,
                                 termin: item.event,
                                 kalender: calendarName,
                                 timestamp: Date.parse(item._date)
                             })
                         }
                     }
                 }
          
                 // Liste sort by timestamp asc
                 calList.sort(function (a, b) {
                     return a.timestamp == b.timestamp ? 0 : +(a.timestamp > b.timestamp) || -1;
                 });
          
                 // Enter the destination data point that is to be used as object ID in the widget
                 setState(datapointId, JSON.stringify(calList), true);
          
                 function getMyCalendarColor(calendarName) {
                 // assign colors via the calendar names, use calendar name as set in ical
                             if (calendarName === 'MAMA') {
                                 return '#44739e';
                             } else if (calendarName === 'FEIERTAGE') {
                                 return '#5a885d'
                             }
                 }
          
             } catch (e) {
                 console.error(`ical2MaterialDesignTableWidget: message: ${e.message}, stack: ${e.stack}`);
             }
         }
          
         ical2TableWidget_1();
      
      }
      
      // Beschreibe diese Funktion …
      async function tbl_LORENZ() {
         
         var instances = $(`[id=ical.7.data.table]`);
         instances.on(ical2TableWidget_2);
         
         // remove this, if you know to use your own datapoint
         let datapointId = '0_userdata.0.Calendar.Kalender.JSON_LIST_MDWCAL_2'
             createState(datapointId, "[]", {
                 read: true, 
                 write: false, 
                 desc: "JSON String for MDW TABLE Widget", 
                 type: "string", 
                 def: "[]"
             });
          
         function ical2TableWidget_2() {
             try {
                 let calList = [];
          
                 for (var inst = 0; inst <= instances.length - 1; inst++) {
                     let icalObj = getState(instances[inst]).val;
          
                     if (icalObj) {
                         for (var i = 0; i <= icalObj.length - 1; i++) {
                             let item = icalObj[i];
          
                             let calendarName = item._class.split(' ')[0].replace('ical_', '');
          
                             // Objekt für Tabelle erzeugen
                             calList.push({
                                 farbe: `<div style="background: ${getMyCalendarColor(calendarName)}; width: 6px; height: 20px"></div>`,
                                 zeit: item.date,
                                 termin: item.event,
                                 kalender: calendarName,
                                 timestamp: Date.parse(item._date)
                             })
                         }
                     }
                 }
          
                 // Liste sort by timestamp asc
                 calList.sort(function (a, b) {
                     return a.timestamp == b.timestamp ? 0 : +(a.timestamp > b.timestamp) || -1;
                 });
          
                 // Enter the destination data point that is to be used as object ID in the widget
                 setState(datapointId, JSON.stringify(calList), true);
          
                 function getMyCalendarColor(calendarName) {
                     // assign colors via the calendar names, use calendar name as set in ical
                             if (calendarName === 'LORENZ') {
                                 return '#407f88';
                             } else if (calendarName === 'Schiedsrichter') {
                                 return '#008080'
                             } else if (calendarName === 'SCBV') {
                                 return '#5a885d'
                             }
                 }
          
             } catch (e) {
                 console.error(`ical2MaterialDesignTableWidget: message: ${e.message}, stack: ${e.stack}`);
             }
         }
          
         ical2TableWidget_2();
      
      }
      
      // Beschreibe diese Funktion …
      async function tbl_FRANZI() {
         
         var instances = $(`[id=ical.8.data.table]`);
         instances.on(ical2TableWidget_3);
         
         // remove this, if you know to use your own datapoint
         let datapointId = '0_userdata.0.Calendar.Kalender.JSON_LIST_MDWCAL_3'
             createState(datapointId, "[]", {
                 read: true, 
                 write: false, 
                 desc: "JSON String for MDW TABLE Widget", 
                 type: "string", 
                 def: "[]"
             });
          
         function ical2TableWidget_3() {
             try {
                 let calList = [];
          
                 for (var inst = 0; inst <= instances.length - 1; inst++) {
                     let icalObj = getState(instances[inst]).val;
          
                     if (icalObj) {
                         for (var i = 0; i <= icalObj.length - 1; i++) {
                             let item = icalObj[i];
          
                             let calendarName = item._class.split(' ')[0].replace('ical_', '');
          
                             // Objekt für Tabelle erzeugen
                             calList.push({
                                 farbe: `<div style="background: ${getMyCalendarColor(calendarName)}; width: 6px; height: 20px"></div>`,
                                 zeit: item.date,
                                 termin: item.event,
                                 kalender: calendarName,
                                 timestamp: Date.parse(item._date)
                             })
                         }
                     }
                 }
          
                 // Liste sort by timestamp asc
                 calList.sort(function (a, b) {
                     return a.timestamp == b.timestamp ? 0 : +(a.timestamp > b.timestamp) || -1;
                 });
          
                 // Enter the destination data point that is to be used as object ID in the widget
                 setState(datapointId, JSON.stringify(calList), true);
          
                 function getMyCalendarColor(calendarName) {
                     // assign colors via the calendar names, use calendar name as set in ical
                      if (calendarName === 'FRANZI') {
                                 return '#44739e';
                             } else if (calendarName === 'Schiedsrichter') {
                                 return '#008080'
                             } else if (calendarName === 'SCBV') {
                                 return '#5a885d'
                             }
                 }
          
             } catch (e) {
                 console.error(`ical2MaterialDesignTableWidget: message: ${e.message}, stack: ${e.stack}`);
             }
         }
          
         ical2TableWidget_3();
      
      }
      
      // Beschreibe diese Funktion …
      async function tbl_ALLE() {
         
         var instances = $(`[id=ical.9.data.table]`);
         instances.on(ical2TableWidget_4);
         
         // remove this, if you know to use your own datapoint
         let datapointId = '0_userdata.0.Calendar.Kalender.JSON_LIST_MDWCAL_4'
             createState(datapointId, "[]", {
                 read: true, 
                 write: false, 
                 desc: "JSON String for MDW TABLE Widget", 
                 type: "string", 
                 def: "[]"
             });
          
         function ical2TableWidget_4() {
             try {
                 let calList = [];
          
                 for (var inst = 0; inst <= instances.length - 1; inst++) {
                     let icalObj = getState(instances[inst]).val;
          
                     if (icalObj) {
                         for (var i = 0; i <= icalObj.length - 1; i++) {
                             let item = icalObj[i];
          
                             let calendarName = item._class.split(' ')[0].replace('ical_', '');
          
                             // Objekt für Tabelle erzeugen
                             calList.push({
                                 farbe: `<div style="background: ${getMyCalendarColor(calendarName)}; width: 6px; height: 20px"></div>`,
                                 zeit: item.date,
                                 termin: item.event,
                                 kalender: calendarName,
                                 timestamp: Date.parse(item._date)
                             })
                         }
                     }
                 }
          
                 // Liste sort by timestamp asc
                 calList.sort(function (a, b) {
                     return a.timestamp == b.timestamp ? 0 : +(a.timestamp > b.timestamp) || -1;
                 });
          
                 // Enter the destination data point that is to be used as object ID in the widget
                 setState(datapointId, JSON.stringify(calList), true);
          
                 function getMyCalendarColor(calendarName) {
                     // assign colors via the calendar names, use calendar name as set in ical
                      if (calendarName === 'PAPA') {
                                 return '#44739e';
                             } else if (calendarName === 'Schiedsrichter') {
                                 return '#000000'
                             } else if (calendarName === 'PAPA SCBV') {
                                 return '#5a885d'
                             } else if (calendarName === 'MAMA') {
                                 return '#835d85'
                             } else if (calendarName === 'FRANZI') {
                                 return '#848f53'
                             } else if (calendarName === 'LORENZ') {
                                 return '#008080'
                             } else if (calendarName === 'FAMILY') {
                                 return '#F88c2b'
                             }
                 }
          
             } catch (e) {
                 console.error(`ical2MaterialDesignTableWidget: message: ${e.message}, stack: ${e.stack}`);
             }
         }
          
         ical2TableWidget_4();
      
      }
      
      
      schedule1 = schedule('*/5 * * * *', async () => {
       await tbl_PAPA();
       await wait(5000);
       await tbl_MAMA();
       await wait(5000);
       await tbl_LORENZ();
       await wait(5000);
       await tbl_FRANZI();
       await wait(5000);
       await tbl_ALLE();
       console.info('CAL_TBL_UPDATE');
      });
      
      //JTNDeG1sJTIweG1sbnMlM0QlMjJodHRwcyUzQSUyRiUyRmRldmVsb3BlcnMuZ29vZ2xlLmNvbSUyRmJsb2NrbHklMkZ4bWwlMjIlM0UlM0N2YXJpYWJsZXMlM0UlM0N2YXJpYWJsZSUyMHR5cGUlM0QlMjJjcm9uJTIyJTIwaWQlM0QlMjJzY2hlZHVsZTElMjIlM0VzY2hlZHVsZTElM0MlMkZ2YXJpYWJsZSUzRSUzQyUyRnZhcmlhYmxlcyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnNjaGVkdWxlX2NyZWF0ZSUyMiUyMGlkJTNEJTIyKSU1QiU3RHF3UExGSy1oZWE1bCU3QkF5UlUlMjIlMjB4JTNEJTIyMTEzJTIyJTIweSUzRCUyMjYyJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRXNjaGVkdWxlMSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyU0NIRURVTEUlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfY3JvbiUyMiUyMGlkJTNEJTIyMH4lNDBxdWMlM0ZjVHduJTVFbFRhLSUzRllJaCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkNST04lMjIlM0UqJTIwKiUyMColMjAqJTIwKiUzQyUyRmZpZWxkJTNFJTNDJTJGc2hhZG93JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyZmllbGRfY3JvbiUyMiUyMGlkJTNEJTIyJTVEJTNGNzF0QSUzQiUyNX51akF4VCUyQmQlNUJUeEQlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJDUk9OJTIyJTNFKiUyRjUlMjAqJTIwKiUyMColMjAqJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMlNUQVRFTUVOVCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbW5vcmV0dXJuJTIyJTIwaWQlM0QlMjIlNUVQNkUzWWIlM0FnMFZUcE0lN0MlMkZzOGgyJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIydGJsX1BBUEElMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJ0aW1lb3V0c193YWl0JTIyJTIwaWQlM0QlMjJpdyU0MCFDT3U1NCUyQ2klM0ExeSUzRm1QRCU3QyU1RCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkRFTEFZJTIyJTNFNSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVU5JVCUyMiUzRXNlYyUzQyUyRmZpZWxkJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbW5vcmV0dXJuJTIyJTIwaWQlM0QlMjIlN0NuJTJGejhxJTYwcURGJTJCbFJBV0MlN0N+JTJGJTdEJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIydGJsX01BTUElMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJ0aW1lb3V0c193YWl0JTIyJTIwaWQlM0QlMjJmdnpZfiEuQzglM0IlMjMlNURPbGZSJTVFdThWJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyREVMQVklMjIlM0U1JTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJVTklUJTIyJTNFc2VjJTNDJTJGZmllbGQlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMiU1QipKcyU2MCUzQlh5bFVDSmE4Z3MwJTdEaWslMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJ0YmxfTE9SRU5aJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGltZW91dHNfd2FpdCUyMiUyMGlkJTNEJTIydHR1JTI1JTYwT1ZRcFJmcXElN0NDVWt6Y1QlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJERUxBWSUyMiUzRTUlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlVOSVQlMjIlM0VzZWMlM0MlMkZmaWVsZCUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21ub3JldHVybiUyMiUyMGlkJTNEJTIyeVJiYU9GakclMkY0KUFmTDJYNGlyUCUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMnRibF9GUkFOWkklMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJ0aW1lb3V0c193YWl0JTIyJTIwaWQlM0QlMjIlM0F1cjN2MSUyM0lEZTVsJTIzSSU0MHU4TyU1RC4lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJERUxBWSUyMiUzRTUlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlVOSVQlMjIlM0VzZWMlM0MlMkZmaWVsZCUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21ub3JldHVybiUyMiUyMGlkJTNEJTIyRnNuV08lN0RjUlhjV0JYdEUlNjBTeCUzQmMlMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJ0YmxfQUxMRSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJaSi5xJTdEfn5xJTVEJTdCJTNGY0ElNURocyU1QiUzRDBkJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU2V2ZXJpdHklMjIlM0VpbmZvJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTNDc2hhZG93JTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMkhaNCUyRkxyMSU3QzIuJTNCfk4lNUJQR0ElN0I4JTdEJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRUNBTF9UQkxfVVBEQVRFJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDJTJGYmxvY2slM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2RlZmN1c3RvbW5vcmV0dXJuJTIyJTIwaWQlM0QlMjJfenItRyhQdHljVjZVbCUyRkdFcWIlN0MlMjIlMjB4JTNEJTIyMzEzJTIyJTIweSUzRCUyMjIzOCUyMiUzRSUzQ211dGF0aW9uJTIwc3RhdGVtZW50cyUzRCUyMmZhbHNlJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFdGJsX1BBUEElM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRURRcDJZWElnYVc1emRHRnVZMlZ6SUQwZ0pDaGdXMmxrUFdsallXd3VOUzVrWVhSaExuUmhZbXhsWFdBcE93MEthVzV6ZEdGdVkyVnpMbTl1S0dsallXd3lWR0ZpYkdWWGFXUm5aWFJmTUNrN0RRb05DaTh2SUhKbGJXOTJaU0IwYUdsekxDQnBaaUI1YjNVZ2EyNXZkeUIwYnlCMWMyVWdlVzkxY2lCdmQyNGdaR0YwWVhCdmFXNTBEUXBzWlhRZ1pHRjBZWEJ2YVc1MFNXUWdQU0FuTUY5MWMyVnlaR0YwWVM0d0xrTmhiR1Z1WkdGeUxrdGhiR1Z1WkdWeUxrcFRUMDVmVEVsVFZGOU5SRmREUVV4Zk1DY05DaUFnSUNCamNtVmhkR1ZUZEdGMFpTaGtZWFJoY0c5cGJuUkpaQ3dnSWx0ZElpd2dldzBLSUNBZ0lDQWdJQ0J5WldGa09pQjBjblZsTENBTkNpQWdJQ0FnSUNBZ2QzSnBkR1U2SUdaaGJITmxMQ0FOQ2lBZ0lDQWdJQ0FnWkdWell6b2dJa3BUVDA0Z1UzUnlhVzVuSUdadmNpQk5SRmNnVkVGQ1RFVWdWMmxrWjJWMElpd2dEUW9nSUNBZ0lDQWdJSFI1Y0dVNklDSnpkSEpwYm1jaUxDQU5DaUFnSUNBZ0lDQWdaR1ZtT2lBaVcxMGlEUW9nSUNBZ2ZTazdEUW9nRFFwbWRXNWpkR2x2YmlCcFkyRnNNbFJoWW14bFYybGtaMlYwWHpBb0tTQjdEUW9nSUNBZ2RISjVJSHNOQ2lBZ0lDQWdJQ0FnYkdWMElHTmhiRXhwYzNRZ1BTQmJYVHNOQ2lBTkNpQWdJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FXNXpkQ0E5SURBN0lHbHVjM1FnUEQwZ2FXNXpkR0Z1WTJWekxteGxibWQwYUNBdElERTdJR2x1YzNRckt5a2dldzBLSUNBZ0lDQWdJQ0FnSUNBZ2JHVjBJR2xqWVd4UFltb2dQU0JuWlhSVGRHRjBaU2hwYm5OMFlXNWpaWE5iYVc1emRGMHBMblpoYkRzTkNpQU5DaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBZMkZzVDJKcUtTQjdEUW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQRDBnYVdOaGJFOWlhaTVzWlc1bmRHZ2dMU0F4T3lCcEt5c3BJSHNOQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHVjBJR2wwWlcwZ1BTQnBZMkZzVDJKcVcybGRPdzBLSUEwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNaWFFnWTJGc1pXNWtZWEpPWVcxbElEMGdhWFJsYlM1ZlkyeGhjM011YzNCc2FYUW9KeUFuS1Zzd1hTNXlaWEJzWVdObEtDZHBZMkZzWHljc0lDY25LVHNOQ2lBTkNpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnVDJKcVpXdDBJR2JEdkhJZ1ZHRmlaV3hzWlNCbGNucGxkV2RsYmcwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZV3hNYVhOMExuQjFjMmdvZXcwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm1GeVltVTZJR0E4WkdsMklITjBlV3hsUFNKaVlXTnJaM0p2ZFc1a09pQWtlMmRsZEUxNVEyRnNaVzVrWVhKRGIyeHZjaWhqWVd4bGJtUmhjazVoYldVcGZUc2dkMmxrZEdnNklEWndlRHNnYUdWcFoyaDBPaUF5TUhCNElqNDhMMlJwZGo1Z0xBMEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2VtVnBkRG9nYVhSbGJTNWtZWFJsTEEwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdWeWJXbHVPaUJwZEdWdExtVjJaVzUwTEEwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYTJGc1pXNWtaWEk2SUdOaGJHVnVaR0Z5VG1GdFpTd05DaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBiV1Z6ZEdGdGNEb2dSR0YwWlM1d1lYSnpaU2hwZEdWdExsOWtZWFJsS1EwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlLUTBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBOQ2lBZ0lDQWdJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdmUTBLSUEwS0lDQWdJQ0FnSUNBdkx5Qk1hWE4wWlNCemIzSjBJR0o1SUhScGJXVnpkR0Z0Y0NCaGMyTU5DaUFnSUNBZ0lDQWdZMkZzVEdsemRDNXpiM0owS0daMWJtTjBhVzl1SUNoaExDQmlLU0I3RFFvZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1lTNTBhVzFsYzNSaGJYQWdQVDBnWWk1MGFXMWxjM1JoYlhBZ1B5QXdJRG9nS3loaExuUnBiV1Z6ZEdGdGNDQSUyQklHSXVkR2x0WlhOMFlXMXdLU0I4ZkNBdE1Uc05DaUFnSUNBZ0lDQWdmU2s3RFFvZ0RRb2dJQ0FnSUNBZ0lDOHZJRVZ1ZEdWeUlIUm9aU0JrWlhOMGFXNWhkR2x2YmlCa1lYUmhJSEJ2YVc1MElIUm9ZWFFnYVhNZ2RHOGdZbVVnZFhObFpDQmhjeUJ2WW1wbFkzUWdTVVFnYVc0Z2RHaGxJSGRwWkdkbGRBMEtJQ0FnSUNBZ0lDQnpaWFJUZEdGMFpTaGtZWFJoY0c5cGJuUkpaQ3dnU2xOUFRpNXpkSEpwYm1kcFpua29ZMkZzVEdsemRDa3NJSFJ5ZFdVcE93MEtJQTBLSUNBZ0lDQWdJQ0JtZFc1amRHbHZiaUJuWlhSTmVVTmhiR1Z1WkdGeVEyOXNiM0lvWTJGc1pXNWtZWEpPWVcxbEtTQjdEUW9nSUNBZ0lDQWdJQ0FnSUNBdkx5QmhjM05wWjI0Z1kyOXNiM0p6SUhacFlTQjBhR1VnWTJGc1pXNWtZWElnYm1GdFpYTXNJSFZ6WlNCallXeGxibVJoY2lCdVlXMWxJR0Z6SUhObGRDQnBiaUJwWTJGc0RRb2dJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHTmhiR1Z1WkdGeVRtRnRaU0E5UFQwZ0owMXBZMmhoWld3bktTQjdEUW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0p5TTBORGN6T1dVbk93MEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0dOaGJHVnVaR0Z5VG1GdFpTQTlQVDBnSjFOamFHbGxaSE55YVdOb2RHVnlKeWtnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJQ2NqTURBNE1EZ3dKdzBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHTmhiR1Z1WkdGeVRtRnRaU0E5UFQwZ0oxTkRRbFluS1NCN0RRb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnSnlNMVlUZzROV1FuRFFvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdmUTBLSUEwS0lDQWdJSDBnWTJGMFkyZ2dLR1VwSUhzTkNpQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1bGNuSnZjaWhnYVdOaGJESk5ZWFJsY21saGJFUmxjMmxuYmxSaFlteGxWMmxrWjJWME9pQnRaWE56WVdkbE9pQWtlMlV1YldWemMyRm5aWDBzSUhOMFlXTnJPaUFrZTJVdWMzUmhZMnQ5WUNrN0RRb2dJQ0FnZlEwS2ZRMEtJQTBLYVdOaGJESlVZV0pzWlZkcFpHZGxkRjh3S0NrN0RRbyUzRCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21ub3JldHVybiUyMiUyMGlkJTNEJTIyMCU1RCUzRGsyRkklMkNVMllaUFlnOTBGa3UlMjIlMjB4JTNEJTIyMzEyJTIyJTIweSUzRCUyMjI4OCUyMiUzRSUzQ211dGF0aW9uJTIwc3RhdGVtZW50cyUzRCUyMmZhbHNlJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFdGJsX01BTUElM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRURRcDJZWElnYVc1emRHRnVZMlZ6SUQwZ0pDaGdXMmxrUFdsallXd3VOaTVrWVhSaExuUmhZbXhsWFdBcE93MEthVzV6ZEdGdVkyVnpMbTl1S0dsallXd3lWR0ZpYkdWWGFXUm5aWFJmTVNrN0RRb05DaTh2SUhKbGJXOTJaU0IwYUdsekxDQnBaaUI1YjNVZ2EyNXZkeUIwYnlCMWMyVWdlVzkxY2lCdmQyNGdaR0YwWVhCdmFXNTBEUXBzWlhRZ1pHRjBZWEJ2YVc1MFNXUWdQU0FuTUY5MWMyVnlaR0YwWVM0d0xrTmhiR1Z1WkdGeUxrdGhiR1Z1WkdWeUxrcFRUMDVmVEVsVFZGOU5SRmREUVV4Zk1TY05DaUFnSUNCamNtVmhkR1ZUZEdGMFpTaGtZWFJoY0c5cGJuUkpaQ3dnSWx0ZElpd2dldzBLSUNBZ0lDQWdJQ0J5WldGa09pQjBjblZsTENBTkNpQWdJQ0FnSUNBZ2QzSnBkR1U2SUdaaGJITmxMQ0FOQ2lBZ0lDQWdJQ0FnWkdWell6b2dJa3BUVDA0Z1UzUnlhVzVuSUdadmNpQk5SRmNnVkVGQ1RFVWdWMmxrWjJWMElpd2dEUW9nSUNBZ0lDQWdJSFI1Y0dVNklDSnpkSEpwYm1jaUxDQU5DaUFnSUNBZ0lDQWdaR1ZtT2lBaVcxMGlEUW9nSUNBZ2ZTazdEUW9nRFFwbWRXNWpkR2x2YmlCcFkyRnNNbFJoWW14bFYybGtaMlYwWHpFb0tTQjdEUW9nSUNBZ2RISjVJSHNOQ2lBZ0lDQWdJQ0FnYkdWMElHTmhiRXhwYzNRZ1BTQmJYVHNOQ2lBTkNpQWdJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FXNXpkQ0E5SURBN0lHbHVjM1FnUEQwZ2FXNXpkR0Z1WTJWekxteGxibWQwYUNBdElERTdJR2x1YzNRckt5a2dldzBLSUNBZ0lDQWdJQ0FnSUNBZ2JHVjBJR2xqWVd4UFltb2dQU0JuWlhSVGRHRjBaU2hwYm5OMFlXNWpaWE5iYVc1emRGMHBMblpoYkRzTkNpQU5DaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBZMkZzVDJKcUtTQjdEUW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQRDBnYVdOaGJFOWlhaTVzWlc1bmRHZ2dMU0F4T3lCcEt5c3BJSHNOQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHVjBJR2wwWlcwZ1BTQnBZMkZzVDJKcVcybGRPdzBLSUEwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNaWFFnWTJGc1pXNWtZWEpPWVcxbElEMGdhWFJsYlM1ZlkyeGhjM011YzNCc2FYUW9KeUFuS1Zzd1hTNXlaWEJzWVdObEtDZHBZMkZzWHljc0lDY25LVHNOQ2lBTkNpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnVDJKcVpXdDBJR2JEdkhJZ1ZHRmlaV3hzWlNCbGNucGxkV2RsYmcwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZV3hNYVhOMExuQjFjMmdvZXcwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm1GeVltVTZJR0E4WkdsMklITjBlV3hsUFNKaVlXTnJaM0p2ZFc1a09pQWtlMmRsZEUxNVEyRnNaVzVrWVhKRGIyeHZjaWhqWVd4bGJtUmhjazVoYldVcGZUc2dkMmxrZEdnNklEWndlRHNnYUdWcFoyaDBPaUF5TUhCNElqNDhMMlJwZGo1Z0xBMEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2VtVnBkRG9nYVhSbGJTNWtZWFJsTEEwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdWeWJXbHVPaUJwZEdWdExtVjJaVzUwTEEwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYTJGc1pXNWtaWEk2SUdOaGJHVnVaR0Z5VG1GdFpTd05DaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBiV1Z6ZEdGdGNEb2dSR0YwWlM1d1lYSnpaU2hwZEdWdExsOWtZWFJsS1EwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlLUTBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBOQ2lBZ0lDQWdJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdmUTBLSUEwS0lDQWdJQ0FnSUNBdkx5Qk1hWE4wWlNCemIzSjBJR0o1SUhScGJXVnpkR0Z0Y0NCaGMyTU5DaUFnSUNBZ0lDQWdZMkZzVEdsemRDNXpiM0owS0daMWJtTjBhVzl1SUNoaExDQmlLU0I3RFFvZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1lTNTBhVzFsYzNSaGJYQWdQVDBnWWk1MGFXMWxjM1JoYlhBZ1B5QXdJRG9nS3loaExuUnBiV1Z6ZEdGdGNDQSUyQklHSXVkR2x0WlhOMFlXMXdLU0I4ZkNBdE1Uc05DaUFnSUNBZ0lDQWdmU2s3RFFvZ0RRb2dJQ0FnSUNBZ0lDOHZJRVZ1ZEdWeUlIUm9aU0JrWlhOMGFXNWhkR2x2YmlCa1lYUmhJSEJ2YVc1MElIUm9ZWFFnYVhNZ2RHOGdZbVVnZFhObFpDQmhjeUJ2WW1wbFkzUWdTVVFnYVc0Z2RHaGxJSGRwWkdkbGRBMEtJQ0FnSUNBZ0lDQnpaWFJUZEdGMFpTaGtZWFJoY0c5cGJuUkpaQ3dnU2xOUFRpNXpkSEpwYm1kcFpua29ZMkZzVEdsemRDa3NJSFJ5ZFdVcE93MEtJQTBLSUNBZ0lDQWdJQ0JtZFc1amRHbHZiaUJuWlhSTmVVTmhiR1Z1WkdGeVEyOXNiM0lvWTJGc1pXNWtZWEpPWVcxbEtTQjdEUW9nSUNBZ0lDQWdJQzh2SUdGemMybG5iaUJqYjJ4dmNuTWdkbWxoSUhSb1pTQmpZV3hsYm1SaGNpQnVZVzFsY3l3Z2RYTmxJR05oYkdWdVpHRnlJRzVoYldVZ1lYTWdjMlYwSUdsdUlHbGpZV3dOQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR05oYkdWdVpHRnlUbUZ0WlNBOVBUMGdKMDFCVFVFbktTQjdEUW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0p5TTBORGN6T1dVbk93MEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0dOaGJHVnVaR0Z5VG1GdFpTQTlQVDBnSjBaRlNVVlNWRUZIUlNjcElIc05DaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlBbkl6VmhPRGcxWkNjTkNpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmUTBLSUNBZ0lDQWdJQ0I5RFFvZ0RRb2dJQ0FnZlNCallYUmphQ0FvWlNrZ2V3MEtJQ0FnSUNBZ0lDQmpiMjV6YjJ4bExtVnljbTl5S0dCcFkyRnNNazFoZEdWeWFXRnNSR1Z6YVdkdVZHRmliR1ZYYVdSblpYUTZJRzFsYzNOaFoyVTZJQ1I3WlM1dFpYTnpZV2RsZlN3Z2MzUmhZMnM2SUNSN1pTNXpkR0ZqYTMxZ0tUc05DaUFnSUNCOURRcDlEUW9nRFFwcFkyRnNNbFJoWW14bFYybGtaMlYwWHpFb0tUc05DZyUzRCUzRCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21ub3JldHVybiUyMiUyMGlkJTNEJTIyJTJCJTVFZy0lNUJxOGlBJTIza2MwSy5NVGR4QyUyMiUyMHglM0QlMjIzMTIlMjIlMjB5JTNEJTIyMzM4JTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0V0YmxfTE9SRU5aJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTQ1JJUFQlMjIlM0VEUXAyWVhJZ2FXNXpkR0Z1WTJWeklEMGdKQ2hnVzJsa1BXbGpZV3d1Tnk1a1lYUmhMblJoWW14bFhXQXBPdzBLYVc1emRHRnVZMlZ6TG05dUtHbGpZV3d5VkdGaWJHVlhhV1JuWlhSZk1pazdEUW9OQ2k4dklISmxiVzkyWlNCMGFHbHpMQ0JwWmlCNWIzVWdhMjV2ZHlCMGJ5QjFjMlVnZVc5MWNpQnZkMjRnWkdGMFlYQnZhVzUwRFFwc1pYUWdaR0YwWVhCdmFXNTBTV1FnUFNBbk1GOTFjMlZ5WkdGMFlTNHdMa05oYkdWdVpHRnlMa3RoYkdWdVpHVnlMa3BUVDA1ZlRFbFRWRjlOUkZkRFFVeGZNaWNOQ2lBZ0lDQmpjbVZoZEdWVGRHRjBaU2hrWVhSaGNHOXBiblJKWkN3Z0lsdGRJaXdnZXcwS0lDQWdJQ0FnSUNCeVpXRmtPaUIwY25WbExDQU5DaUFnSUNBZ0lDQWdkM0pwZEdVNklHWmhiSE5sTENBTkNpQWdJQ0FnSUNBZ1pHVnpZem9nSWtwVFQwNGdVM1J5YVc1bklHWnZjaUJOUkZjZ1ZFRkNURVVnVjJsa1oyVjBJaXdnRFFvZ0lDQWdJQ0FnSUhSNWNHVTZJQ0p6ZEhKcGJtY2lMQ0FOQ2lBZ0lDQWdJQ0FnWkdWbU9pQWlXMTBpRFFvZ0lDQWdmU2s3RFFvZ0RRcG1kVzVqZEdsdmJpQnBZMkZzTWxSaFlteGxWMmxrWjJWMFh6SW9LU0I3RFFvZ0lDQWdkSEo1SUhzTkNpQWdJQ0FnSUNBZ2JHVjBJR05oYkV4cGMzUWdQU0JiWFRzTkNpQU5DaUFnSUNBZ0lDQWdabTl5SUNoMllYSWdhVzV6ZENBOUlEQTdJR2x1YzNRZ1BEMGdhVzV6ZEdGdVkyVnpMbXhsYm1kMGFDQXRJREU3SUdsdWMzUXJLeWtnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdiR1YwSUdsallXeFBZbW9nUFNCblpYUlRkR0YwWlNocGJuTjBZVzVqWlhOYmFXNXpkRjBwTG5aaGJEc05DaUFOQ2lBZ0lDQWdJQ0FnSUNBZ0lHbG1JQ2hwWTJGc1QySnFLU0I3RFFvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm05eUlDaDJZWElnYVNBOUlEQTdJR2tnUEQwZ2FXTmhiRTlpYWk1c1pXNW5kR2dnTFNBeE95QnBLeXNwSUhzTkNpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdiR1YwSUdsMFpXMGdQU0JwWTJGc1QySnFXMmxkT3cwS0lBMEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JzWlhRZ1kyRnNaVzVrWVhKT1lXMWxJRDBnYVhSbGJTNWZZMnhoYzNNdWMzQnNhWFFvSnlBbktWc3dYUzV5WlhCc1lXTmxLQ2RwWTJGc1h5Y3NJQ2NuS1RzTkNpQU5DaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnTHk4Z1QySnFaV3QwSUdiRHZISWdWR0ZpWld4c1pTQmxjbnBsZFdkbGJnMEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0JqWVd4TWFYTjBMbkIxYzJnb2V3MEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptRnlZbVU2SUdBOFpHbDJJSE4wZVd4bFBTSmlZV05yWjNKdmRXNWtPaUFrZTJkbGRFMTVRMkZzWlc1a1lYSkRiMnh2Y2loallXeGxibVJoY2s1aGJXVXBmVHNnZDJsa2RHZzZJRFp3ZURzZ2FHVnBaMmgwT2lBeU1IQjRJajQ4TDJScGRqNWdMQTBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdlbVZwZERvZ2FYUmxiUzVrWVhSbExBMEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2RHVnliV2x1T2lCcGRHVnRMbVYyWlc1MExBMEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2EyRnNaVzVrWlhJNklHTmhiR1Z1WkdGeVRtRnRaU3dOQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSFJwYldWemRHRnRjRG9nUkdGMFpTNXdZWEp6WlNocGRHVnRMbDlrWVhSbEtRMEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5S1EwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUgwTkNpQWdJQ0FnSUNBZ0lDQWdJSDBOQ2lBZ0lDQWdJQ0FnZlEwS0lBMEtJQ0FnSUNBZ0lDQXZMeUJNYVhOMFpTQnpiM0owSUdKNUlIUnBiV1Z6ZEdGdGNDQmhjMk1OQ2lBZ0lDQWdJQ0FnWTJGc1RHbHpkQzV6YjNKMEtHWjFibU4wYVc5dUlDaGhMQ0JpS1NCN0RRb2dJQ0FnSUNBZ0lDQWdJQ0J5WlhSMWNtNGdZUzUwYVcxbGMzUmhiWEFnUFQwZ1lpNTBhVzFsYzNSaGJYQWdQeUF3SURvZ0t5aGhMblJwYldWemRHRnRjQ0ElMkJJR0l1ZEdsdFpYTjBZVzF3S1NCOGZDQXRNVHNOQ2lBZ0lDQWdJQ0FnZlNrN0RRb2dEUW9nSUNBZ0lDQWdJQzh2SUVWdWRHVnlJSFJvWlNCa1pYTjBhVzVoZEdsdmJpQmtZWFJoSUhCdmFXNTBJSFJvWVhRZ2FYTWdkRzhnWW1VZ2RYTmxaQ0JoY3lCdlltcGxZM1FnU1VRZ2FXNGdkR2hsSUhkcFpHZGxkQTBLSUNBZ0lDQWdJQ0J6WlhSVGRHRjBaU2hrWVhSaGNHOXBiblJKWkN3Z1NsTlBUaTV6ZEhKcGJtZHBabmtvWTJGc1RHbHpkQ2tzSUhSeWRXVXBPdzBLSUEwS0lDQWdJQ0FnSUNCbWRXNWpkR2x2YmlCblpYUk5lVU5oYkdWdVpHRnlRMjlzYjNJb1kyRnNaVzVrWVhKT1lXMWxLU0I3RFFvZ0lDQWdJQ0FnSUNBZ0lDQXZMeUJoYzNOcFoyNGdZMjlzYjNKeklIWnBZU0IwYUdVZ1kyRnNaVzVrWVhJZ2JtRnRaWE1zSUhWelpTQmpZV3hsYm1SaGNpQnVZVzFsSUdGeklITmxkQ0JwYmlCcFkyRnNEUW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdsbUlDaGpZV3hsYm1SaGNrNWhiV1VnUFQwOUlDZE1UMUpGVGxvbktTQjdEUW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0p5TTBNRGRtT0Rnbk93MEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0dOaGJHVnVaR0Z5VG1GdFpTQTlQVDBnSjFOamFHbGxaSE55YVdOb2RHVnlKeWtnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJQ2NqTURBNE1EZ3dKdzBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUlHVnNjMlVnYVdZZ0tHTmhiR1Z1WkdGeVRtRnRaU0E5UFQwZ0oxTkRRbFluS1NCN0RRb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnSnlNMVlUZzROV1FuRFFvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdmUTBLSUEwS0lDQWdJSDBnWTJGMFkyZ2dLR1VwSUhzTkNpQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1bGNuSnZjaWhnYVdOaGJESk5ZWFJsY21saGJFUmxjMmxuYmxSaFlteGxWMmxrWjJWME9pQnRaWE56WVdkbE9pQWtlMlV1YldWemMyRm5aWDBzSUhOMFlXTnJPaUFrZTJVdWMzUmhZMnQ5WUNrN0RRb2dJQ0FnZlEwS2ZRMEtJQTBLYVdOaGJESlVZV0pzWlZkcFpHZGxkRjh5S0NrN0RRbyUzRCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21ub3JldHVybiUyMiUyMGlkJTNEJTIyUCUzQVdhTVUlMjMlMjQxX2VaVyU3Q0QlNUVkJTYwV3glMjIlMjB4JTNEJTIyMzEzJTIyJTIweSUzRCUyMjM4OCUyMiUzRSUzQ211dGF0aW9uJTIwc3RhdGVtZW50cyUzRCUyMmZhbHNlJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFdGJsX0ZSQU5aSSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFRFFwMllYSWdhVzV6ZEdGdVkyVnpJRDBnSkNoZ1cybGtQV2xqWVd3dU9DNWtZWFJoTG5SaFlteGxYV0FwT3cwS2FXNXpkR0Z1WTJWekxtOXVLR2xqWVd3eVZHRmliR1ZYYVdSblpYUmZNeWs3RFFvTkNpOHZJSEpsYlc5MlpTQjBhR2x6TENCcFppQjViM1VnYTI1dmR5QjBieUIxYzJVZ2VXOTFjaUJ2ZDI0Z1pHRjBZWEJ2YVc1MERRcHNaWFFnWkdGMFlYQnZhVzUwU1dRZ1BTQW5NRjkxYzJWeVpHRjBZUzR3TGtOaGJHVnVaR0Z5TGt0aGJHVnVaR1Z5TGtwVFQwNWZURWxUVkY5TlJGZERRVXhmTXljTkNpQWdJQ0JqY21WaGRHVlRkR0YwWlNoa1lYUmhjRzlwYm5SSlpDd2dJbHRkSWl3Z2V3MEtJQ0FnSUNBZ0lDQnlaV0ZrT2lCMGNuVmxMQ0FOQ2lBZ0lDQWdJQ0FnZDNKcGRHVTZJR1poYkhObExDQU5DaUFnSUNBZ0lDQWdaR1Z6WXpvZ0lrcFRUMDRnVTNSeWFXNW5JR1p2Y2lCTlJGY2dWRUZDVEVVZ1YybGtaMlYwSWl3Z0RRb2dJQ0FnSUNBZ0lIUjVjR1U2SUNKemRISnBibWNpTENBTkNpQWdJQ0FnSUNBZ1pHVm1PaUFpVzEwaURRb2dJQ0FnZlNrN0RRb2dEUXBtZFc1amRHbHZiaUJwWTJGc01sUmhZbXhsVjJsa1oyVjBYek1vS1NCN0RRb2dJQ0FnZEhKNUlIc05DaUFnSUNBZ0lDQWdiR1YwSUdOaGJFeHBjM1FnUFNCYlhUc05DaUFOQ2lBZ0lDQWdJQ0FnWm05eUlDaDJZWElnYVc1emRDQTlJREE3SUdsdWMzUWdQRDBnYVc1emRHRnVZMlZ6TG14bGJtZDBhQ0F0SURFN0lHbHVjM1FyS3lrZ2V3MEtJQ0FnSUNBZ0lDQWdJQ0FnYkdWMElHbGpZV3hQWW1vZ1BTQm5aWFJUZEdGMFpTaHBibk4wWVc1alpYTmJhVzV6ZEYwcExuWmhiRHNOQ2lBTkNpQWdJQ0FnSUNBZ0lDQWdJR2xtSUNocFkyRnNUMkpxS1NCN0RRb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FTQTlJREE3SUdrZ1BEMGdhV05oYkU5aWFpNXNaVzVuZEdnZ0xTQXhPeUJwS3lzcElIc05DaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYkdWMElHbDBaVzBnUFNCcFkyRnNUMkpxVzJsZE93MEtJQTBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCc1pYUWdZMkZzWlc1a1lYSk9ZVzFsSUQwZ2FYUmxiUzVmWTJ4aGMzTXVjM0JzYVhRb0p5QW5LVnN3WFM1eVpYQnNZV05sS0NkcFkyRnNYeWNzSUNjbktUc05DaUFOQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0x5OGdUMkpxWld0MElHYkR2SElnVkdGaVpXeHNaU0JsY25wbGRXZGxiZzBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCallXeE1hWE4wTG5CMWMyZ29ldzBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabUZ5WW1VNklHQThaR2wySUhOMGVXeGxQU0ppWVdOclozSnZkVzVrT2lBa2UyZGxkRTE1UTJGc1pXNWtZWEpEYjJ4dmNpaGpZV3hsYm1SaGNrNWhiV1VwZlRzZ2QybGtkR2c2SURad2VEc2dhR1ZwWjJoME9pQXlNSEI0SWo0OEwyUnBkajVnTEEwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZW1WcGREb2dhWFJsYlM1a1lYUmxMQTBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdkR1Z5YldsdU9pQnBkR1Z0TG1WMlpXNTBMQTBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdhMkZzWlc1a1pYSTZJR05oYkdWdVpHRnlUbUZ0WlN3TkNpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhScGJXVnpkR0Z0Y0RvZ1JHRjBaUzV3WVhKelpTaHBkR1Z0TGw5a1lYUmxLUTBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOUtRMEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdJQ0FnSUgwTkNpQWdJQ0FnSUNBZ2ZRMEtJQTBLSUNBZ0lDQWdJQ0F2THlCTWFYTjBaU0J6YjNKMElHSjVJSFJwYldWemRHRnRjQ0JoYzJNTkNpQWdJQ0FnSUNBZ1kyRnNUR2x6ZEM1emIzSjBLR1oxYm1OMGFXOXVJQ2hoTENCaUtTQjdEUW9nSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnWVM1MGFXMWxjM1JoYlhBZ1BUMGdZaTUwYVcxbGMzUmhiWEFnUHlBd0lEb2dLeWhoTG5ScGJXVnpkR0Z0Y0NBJTJCSUdJdWRHbHRaWE4wWVcxd0tTQjhmQ0F0TVRzTkNpQWdJQ0FnSUNBZ2ZTazdEUW9nRFFvZ0lDQWdJQ0FnSUM4dklFVnVkR1Z5SUhSb1pTQmtaWE4wYVc1aGRHbHZiaUJrWVhSaElIQnZhVzUwSUhSb1lYUWdhWE1nZEc4Z1ltVWdkWE5sWkNCaGN5QnZZbXBsWTNRZ1NVUWdhVzRnZEdobElIZHBaR2RsZEEwS0lDQWdJQ0FnSUNCelpYUlRkR0YwWlNoa1lYUmhjRzlwYm5SSlpDd2dTbE5QVGk1emRISnBibWRwWm5rb1kyRnNUR2x6ZENrc0lIUnlkV1VwT3cwS0lBMEtJQ0FnSUNBZ0lDQm1kVzVqZEdsdmJpQm5aWFJOZVVOaGJHVnVaR0Z5UTI5c2IzSW9ZMkZzWlc1a1lYSk9ZVzFsS1NCN0RRb2dJQ0FnSUNBZ0lDQWdJQ0F2THlCaGMzTnBaMjRnWTI5c2IzSnpJSFpwWVNCMGFHVWdZMkZzWlc1a1lYSWdibUZ0WlhNc0lIVnpaU0JqWVd4bGJtUmhjaUJ1WVcxbElHRnpJSE5sZENCcGJpQnBZMkZzRFFvZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dOaGJHVnVaR0Z5VG1GdFpTQTlQVDBnSjBaU1FVNWFTU2NwSUhzTkNpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUFuSXpRME56TTVaU2M3RFFvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9ZMkZzWlc1a1lYSk9ZVzFsSUQwOVBTQW5VMk5vYVdWa2MzSnBZMmgwWlhJbktTQjdEUW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0p5TXdNRGd3T0RBbkRRb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvWTJGc1pXNWtZWEpPWVcxbElEMDlQU0FuVTBOQ1ZpY3BJSHNOQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSEpsZEhWeWJpQW5JelZoT0RnMVpDY05DaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZlEwS0lDQWdJQ0FnSUNCOURRb2dEUW9nSUNBZ2ZTQmpZWFJqYUNBb1pTa2dldzBLSUNBZ0lDQWdJQ0JqYjI1emIyeGxMbVZ5Y205eUtHQnBZMkZzTWsxaGRHVnlhV0ZzUkdWemFXZHVWR0ZpYkdWWGFXUm5aWFE2SUcxbGMzTmhaMlU2SUNSN1pTNXRaWE56WVdkbGZTd2djM1JoWTJzNklDUjdaUzV6ZEdGamEzMWdLVHNOQ2lBZ0lDQjlEUXA5RFFvZ0RRcHBZMkZzTWxSaFlteGxWMmxrWjJWMFh6TW9LVHNOQ2clM0QlM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMnhodFByNWZDci5zdkh1JTNEKXZIemIlMjIlMjB4JTNEJTIyMzEzJTIyJTIweSUzRCUyMjQzOCUyMiUzRSUzQ211dGF0aW9uJTIwc3RhdGVtZW50cyUzRCUyMmZhbHNlJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFdGJsX0FMTEUlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRURRcDJZWElnYVc1emRHRnVZMlZ6SUQwZ0pDaGdXMmxrUFdsallXd3VPUzVrWVhSaExuUmhZbXhsWFdBcE93MEthVzV6ZEdGdVkyVnpMbTl1S0dsallXd3lWR0ZpYkdWWGFXUm5aWFJmTkNrN0RRb05DaTh2SUhKbGJXOTJaU0IwYUdsekxDQnBaaUI1YjNVZ2EyNXZkeUIwYnlCMWMyVWdlVzkxY2lCdmQyNGdaR0YwWVhCdmFXNTBEUXBzWlhRZ1pHRjBZWEJ2YVc1MFNXUWdQU0FuTUY5MWMyVnlaR0YwWVM0d0xrTmhiR1Z1WkdGeUxrdGhiR1Z1WkdWeUxrcFRUMDVmVEVsVFZGOU5SRmREUVV4Zk5DY05DaUFnSUNCamNtVmhkR1ZUZEdGMFpTaGtZWFJoY0c5cGJuUkpaQ3dnSWx0ZElpd2dldzBLSUNBZ0lDQWdJQ0J5WldGa09pQjBjblZsTENBTkNpQWdJQ0FnSUNBZ2QzSnBkR1U2SUdaaGJITmxMQ0FOQ2lBZ0lDQWdJQ0FnWkdWell6b2dJa3BUVDA0Z1UzUnlhVzVuSUdadmNpQk5SRmNnVkVGQ1RFVWdWMmxrWjJWMElpd2dEUW9nSUNBZ0lDQWdJSFI1Y0dVNklDSnpkSEpwYm1jaUxDQU5DaUFnSUNBZ0lDQWdaR1ZtT2lBaVcxMGlEUW9nSUNBZ2ZTazdEUW9nRFFwbWRXNWpkR2x2YmlCcFkyRnNNbFJoWW14bFYybGtaMlYwWHpRb0tTQjdEUW9nSUNBZ2RISjVJSHNOQ2lBZ0lDQWdJQ0FnYkdWMElHTmhiRXhwYzNRZ1BTQmJYVHNOQ2lBTkNpQWdJQ0FnSUNBZ1ptOXlJQ2gyWVhJZ2FXNXpkQ0E5SURBN0lHbHVjM1FnUEQwZ2FXNXpkR0Z1WTJWekxteGxibWQwYUNBdElERTdJR2x1YzNRckt5a2dldzBLSUNBZ0lDQWdJQ0FnSUNBZ2JHVjBJR2xqWVd4UFltb2dQU0JuWlhSVGRHRjBaU2hwYm5OMFlXNWpaWE5iYVc1emRGMHBMblpoYkRzTkNpQU5DaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaHBZMkZzVDJKcUtTQjdEUW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdabTl5SUNoMllYSWdhU0E5SURBN0lHa2dQRDBnYVdOaGJFOWlhaTVzWlc1bmRHZ2dMU0F4T3lCcEt5c3BJSHNOQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2JHVjBJR2wwWlcwZ1BTQnBZMkZzVDJKcVcybGRPdzBLSUEwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnNaWFFnWTJGc1pXNWtZWEpPWVcxbElEMGdhWFJsYlM1ZlkyeGhjM011YzNCc2FYUW9KeUFuS1Zzd1hTNXlaWEJzWVdObEtDZHBZMkZzWHljc0lDY25LVHNOQ2lBTkNpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdMeThnVDJKcVpXdDBJR2JEdkhJZ1ZHRmlaV3hzWlNCbGNucGxkV2RsYmcwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQmpZV3hNYVhOMExuQjFjMmdvZXcwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWm1GeVltVTZJR0E4WkdsMklITjBlV3hsUFNKaVlXTnJaM0p2ZFc1a09pQWtlMmRsZEUxNVEyRnNaVzVrWVhKRGIyeHZjaWhqWVd4bGJtUmhjazVoYldVcGZUc2dkMmxrZEdnNklEWndlRHNnYUdWcFoyaDBPaUF5TUhCNElqNDhMMlJwZGo1Z0xBMEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2VtVnBkRG9nYVhSbGJTNWtZWFJsTEEwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnZEdWeWJXbHVPaUJwZEdWdExtVjJaVzUwTEEwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnYTJGc1pXNWtaWEk2SUdOaGJHVnVaR0Z5VG1GdFpTd05DaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lIUnBiV1Z6ZEdGdGNEb2dSR0YwWlM1d1lYSnpaU2hwZEdWdExsOWtZWFJsS1EwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlLUTBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBOQ2lBZ0lDQWdJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdmUTBLSUEwS0lDQWdJQ0FnSUNBdkx5Qk1hWE4wWlNCemIzSjBJR0o1SUhScGJXVnpkR0Z0Y0NCaGMyTU5DaUFnSUNBZ0lDQWdZMkZzVEdsemRDNXpiM0owS0daMWJtTjBhVzl1SUNoaExDQmlLU0I3RFFvZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z1lTNTBhVzFsYzNSaGJYQWdQVDBnWWk1MGFXMWxjM1JoYlhBZ1B5QXdJRG9nS3loaExuUnBiV1Z6ZEdGdGNDQSUyQklHSXVkR2x0WlhOMFlXMXdLU0I4ZkNBdE1Uc05DaUFnSUNBZ0lDQWdmU2s3RFFvZ0RRb2dJQ0FnSUNBZ0lDOHZJRVZ1ZEdWeUlIUm9aU0JrWlhOMGFXNWhkR2x2YmlCa1lYUmhJSEJ2YVc1MElIUm9ZWFFnYVhNZ2RHOGdZbVVnZFhObFpDQmhjeUJ2WW1wbFkzUWdTVVFnYVc0Z2RHaGxJSGRwWkdkbGRBMEtJQ0FnSUNBZ0lDQnpaWFJUZEdGMFpTaGtZWFJoY0c5cGJuUkpaQ3dnU2xOUFRpNXpkSEpwYm1kcFpua29ZMkZzVEdsemRDa3NJSFJ5ZFdVcE93MEtJQTBLSUNBZ0lDQWdJQ0JtZFc1amRHbHZiaUJuWlhSTmVVTmhiR1Z1WkdGeVEyOXNiM0lvWTJGc1pXNWtZWEpPWVcxbEtTQjdEUW9nSUNBZ0lDQWdJQ0FnSUNBdkx5QmhjM05wWjI0Z1kyOXNiM0p6SUhacFlTQjBhR1VnWTJGc1pXNWtZWElnYm1GdFpYTXNJSFZ6WlNCallXeGxibVJoY2lCdVlXMWxJR0Z6SUhObGRDQnBiaUJwWTJGc0RRb2dJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHTmhiR1Z1WkdGeVRtRnRaU0E5UFQwZ0oxQkJVRUVuS1NCN0RRb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYUjFjbTRnSnlNME5EY3pPV1VuT3cwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLR05oYkdWdVpHRnlUbUZ0WlNBOVBUMGdKMU5qYUdsbFpITnlhV05vZEdWeUp5a2dldzBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlDY2pNREF3TURBd0p3MEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0dOaGJHVnVaR0Z5VG1GdFpTQTlQVDBnSjFCQlVFRWdVME5DVmljcElIc05DaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lISmxkSFZ5YmlBbkl6VmhPRGcxWkNjTkNpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hqWVd4bGJtUmhjazVoYldVZ1BUMDlJQ2ROUVUxQkp5a2dldzBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVYwZFhKdUlDY2pPRE0xWkRnMUp3MEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0dOaGJHVnVaR0Z5VG1GdFpTQTlQVDBnSjBaU1FVNWFTU2NwSUhzTkNpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUhKbGRIVnliaUFuSXpnME9HWTFNeWNOQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGpZV3hsYm1SaGNrNWhiV1VnUFQwOUlDZE1UMUpGVGxvbktTQjdEUW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWFIxY200Z0p5TXdNRGd3T0RBbkRRb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvWTJGc1pXNWtZWEpPWVcxbElEMDlQU0FuUmtGTlNVeFpKeWtnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WMGRYSnVJQ2NqUmpnNFl6SmlKdzBLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCOURRb2dJQ0FnSUNBZ0lIME5DaUFOQ2lBZ0lDQjlJR05oZEdOb0lDaGxLU0I3RFFvZ0lDQWdJQ0FnSUdOdmJuTnZiR1V1WlhKeWIzSW9ZR2xqWVd3eVRXRjBaWEpwWVd4RVpYTnBaMjVVWVdKc1pWZHBaR2RsZERvZ2JXVnpjMkZuWlRvZ0pIdGxMbTFsYzNOaFoyVjlMQ0J6ZEdGamF6b2dKSHRsTG5OMFlXTnJmV0FwT3cwS0lDQWdJSDBOQ24wTkNpQU5DbWxqWVd3eVZHRmliR1ZYYVdSblpYUmZOQ2dwT3cwSyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGeG1sJTNF
      

      OliverIO Asgothian 2 Replies Last reply Reply Quote 0
      • OliverIO
        OliverIO @Mottimuc last edited by

        @mottimuc sagte in More than 100 subscriptions listed... ?? Woher?:

        also alle 5 minuten werden die diverse funktionen aufgerufen
        in jeder funktion wird per selektor diverse datenpunkte ermittelt
        und für jeden datenpunkt wird ein neuer trigger erzeugt.

        d.h. alle 5 minuten vergrößert sich die anzahl der trigger und es sind immer die selbe anzahl von datenpunkte die dazukommen.

        du solltest dich entscheiden, ob du alle 5 minuten per schedule das skript ablaufen läst, die werte abrufst und dann aktionen ausführen (pull-prinzip)
        oder
        ob du einmalig die trigger erzeugst und darauf waren, bis iobroker dich über änderung der datenpunkte informiert (alles was dann innerhalb der on funktion abläuft.

        jetzt vermischt du beide konzepte und erzeugst einfach nur alle 5 minuten neue trigger, die dann natürlich auch alle aufgerufen werden, wenn sich was ändert

        1 Reply Last reply Reply Quote 2
        • Asgothian
          Asgothian Developer @Mottimuc last edited by

          @mottimuc So ganz steige ich durch das Skript nicht durch, aber:

          • Printe mal das Ergebnis dieses Selektors (instances) ins Log (für jeden der 5 Fälle) - wenn da mehr als ein Objekt heraus kommt macht das schon mal schnell viele subscriptions
          • Du erzeugst die Subskriptions (instances.on(ical2TableWidget_0);)
            alle 5 Minuten für alle 5 Leute. Sprich nach ca. 100 Minuten hat dein Skript 100 subscriptions erreicht.

          Warum die Subscriptions wenn du den Kalender per Cron Job alle 5 Minuten aktualisierst ?

          A.

          M 1 Reply Last reply Reply Quote 1
          • M
            Mottimuc @Asgothian last edited by

            @asgothian
            Hallo zusammen

            ahhhhh, das war mir nicht bewusst, dass ich über instances.on die subscription erzeuge.
            Dann habe ich, wie OIiver richtig formuliert hat, beides fälschlicherweise gleichzeitig gemacht.

            Das Script übersetzt aus dem ICAL Adapter den Datenpunkt für die Anzeige in einem MaterialDesignWidget, welches auf ein JSON zugreift.
            Mein Gedanke war, dass ich eben die Push-Methode nutze, um hier (relativ synchron mit dem cron des ICAL Adapters) die Daten konvertiere.

            Ich hätte noch eine paar allgemeine Fragen dazu:

            1. Subscriptions laufen grundsätzlich immer, solange das Script aktiv ist?

            2. Wie viele Subscriptions je System sind machbar? Gerade für meine Steuerung Lichter und Wohnbereich habe ich hier einiges aufgebaut?
              Klar, das wir von Rechner usw. abhängen. Ich hab bei mir derzeit 3 Raspi 5 laufen....

            3. Kann ich irgendwie "aktive subscriptions" mir anzeigen lassen? In eine Liste protokollieren?

            Danke für Eure Hilfe
            Michael

            OliverIO 1 Reply Last reply Reply Quote 0
            • OliverIO
              OliverIO @Mottimuc last edited by

              @mottimuc

              1. ja, in der befehlsreferenz gibt es noch ein paar weitere Befehle mit denen du das steuern kannst.
              2. viele. Begrenzung ist der Hauptspeicher und dein Prozessor der die getriggerten Aktionen abarbeiten muss.
                Die Warnung kommt deswegen weil man sich durch falsche Programmierung schnell viele von den triggern zulegt, was dann meist in einen Absturz des js Adapters führt. Da gibt es viele Geschichten hier im Forum
                3.So bekommst du eine Liste.
                Ich weiß allerdings nicht, ob das nur per Skript ist oder alle. Wahrscheinlich nur per Skript, hab ich selbst noch nicht verwendet.
                https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#getsubscriptions
              1 Reply Last reply Reply Quote 1
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate

              800
              Online

              31.9k
              Users

              80.1k
              Topics

              1.3m
              Posts

              3
              5
              297
              Loading More Posts
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes
              Reply
              • Reply as topic
              Log in to reply
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
              The ioBroker Community 2014-2023
              logo