рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╛ рдордзреБрдордХреНрдЦреА рдЖрдмрд╛рджреА рд╣реЛ рд░рд╣реА рд╣реИ, рдРрд╕рд╛ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
collection.fetch();
collection.isFetching()===true; // display loading
(collection.isFetching()===false; && collection.length) // display no records found
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧрдХреЗрд╕ (рд╕рд░рд▓реАрдХрд░рдг, рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):
javascript()
// somewhere in the code
collection = new MyCollection();
// somewhere else in the code
view = new MyView({collection:collection});
// and somewhere else in the code
collection.fetch();
рджреГрд╢реНрдп рд╕рдВрдЧреНрд░рд╣ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╕реБрдирддрд╛ рд╣реИ, рдФрд░ рдпрд╛ рддреЛ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ/рдХреЛрдИ рд░рд┐рдХреЙрд░реНрдб рдирд╣реАрдВ/рд░рд┐рдХреЙрд░реНрдб рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП, рдЪреАрдЬрд╝ рдХреЛ рд╕реЗрд╡/рдбрд┐рд▓реАрдЯ/рдЕрдкрдбреЗрдЯ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рд╣рд╛рдп @ g00fy-! рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП "request"
рдФрд░ "sync"
рдИрд╡реЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ?
collection.on('request', function() {
// loading...
}).on('sync', function() {
// display records or "none found"
});
collection.fetch();
_рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ - рдореЗрд░рд╛ рдорддрд▓рдм "request"
рдШрдЯрдирд╛ рд╕реЗ рдерд╛, рди рдХрд┐ "fetch"
._
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдлреБрд▓реНрд▓рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ @braddunbar!
рдзрдиреНрдпрд╡рд╛рдж @caseywebdev! :)
рд╣рдореЗрдВ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ @ g00fy-ред
@braddunbar , @caseywebdev рд╡рд┐рдЪрд╛рд░ рдЙрди рджреЛ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИред (рджреГрд╢реНрдп рдХрд┐рд╕реА рднреА рд░рд╛рдЬреНрдп рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдХреЗрд╡рд▓ _'рд╕реНрд╡рдЪреНрдЫ'_ рд╕рдВрдЧреНрд░рд╣)
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ
рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рджреГрд╢реНрдп рдХреЛ 'рдЕрдиреБрд░реЛрдз' рдФрд░ 'рд╕рд┐рдВрдХ' рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╕реБрдирдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╕рдВрдЧреНрд░рд╣ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рд╕рдВрдХреЗрдд рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рджреГрд╢реНрдп рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд░рд╣рд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рд╕рдВрдЧреНрд░рд╣ рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдпрд╛ рддреЛ _fetched_ , _fetching_ рдпрд╛ _unfetched_ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рджреГрд╢реНрдп рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ (tl: dr рдЙрджрд╛рд╣рд░рдг 3 рджреЗрдЦреЗрдВ) ред
collection = new Backbone.Collection();
view = new Backbone.View({collection:collection});
view.render();
// what should the view render ?
collection.fetch() // now sync signal gets sent
collection = new Backbone.Collection();
collection.fetch(); // now sync signal gets sent
// after fetch completes
// view won't be able to receive 'sync' signal
view = new Backbone.View({collection:collection});
view.render();
// at this point collection.length == 0.
// I guess the view can listen to 'sync' and then render 'empty'
collection = new Backbone.Collection();
collection.fetch(); // now 'request' signal gets sent, but it is pending
// view won't be able to receive 'request' signal
view = new Backbone.View({collection:collection}); // at this point collection.length == 0
// view did not receive the 'request' signal, therefore has no idea that the collection is fetching
// and the view should render 'loading'
// after 2 seconds, 'sync' signal gets sent
рджреГрд╢реНрдп рдпрд╣ рдирд╣реАрдВ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджрд┐ рд╕рдВрдЧреНрд░рд╣.рд▓рдВрдмрд╛рдИ == 0 рд╣реИ рддреЛ рдпрд╣ рдЕрдирдлрд╝реЗрдЪ рд╣реИред
рджреГрд╢реНрдп рдпрд╣ рднреА рдирд╣реАрдВ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдЕрдкреНрд░рд╛рдкреНрдд рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд░рд╛рдЬреНрдп рдореЗрдВ) рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрджрд┐ рд╣рдо рд╕рдВрдЧреНрд░рд╣ рдХреЛ рджреГрд╢реНрдп рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рджреГрд╢реНрдп рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИред
рд╡рд╣реА рдмрд╛рдд рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЬрд╛рддреА рд╣реИ
@ g00fy рдпрджрд┐ рдЖрдк рд╕рдВрдЧреНрд░рд╣ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ fetch
рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреЗ рд╕рдВрдЧреНрд░рд╣ рдкрд░ fetching
рдзреНрд╡рдЬ рдпрд╛ рдРрд╕рд╛ рд╕реЗрдЯ рдХрд░реЗрдВред
collection.on({
request: function () { this.fetching = true; },
'sync error': function () { this.fetching = false; }
});
рдЕрдм рдЖрдкрдХрд╛ рджреГрд╢реНрдп this.collection.fetching
рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ рдФрд░ this.collection
рд▓рд┐рдП sync
рдпрд╛ error
рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред
@ рдХреЗрд╕реАрд╡реЗрдмрджреЗрд╡
рдЕрдиреБрд░реЛрдз рдирд┐рд░рд╕реНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рджреЛ рдЕрдиреБрд░реЛрдз рдПрдХ рд╕рд╛рде рднреЗрдЬреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
// example 1
collection.fetch().abort() // and collection.fetching == true
// example 2 - don't care about abort();
collection.fetch();
collection.fetch();
// 1st request compleated
!!collection.fetching == false // but the 2nd request is pending - should it be loading or not?
// 2nd request completed
рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП do deferred xhr
collection.on({
'request':function(model,xhr){
this.fetching = true;
xhr.fail(function(){this.fetching = false }.bind(this));
},
'sync error': function () { this.fetching = false; }
});
рдЗрд╕реАрд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрд┐рд▓реНрдЯ рдЗрди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреА рд╣рд░ рдПрдиреНрд╣рд╛рдВрд╕рдореЗрдВрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ BB рдХреЛрдб-рдмреЗрд╕ рдлреВрд▓рд╛ рд╣реБрдЖ рд╣реЛрдЧрд╛ред
рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреА рд╣рд░ рд╡реГрджреНрдзрд┐ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдмреАрдмреА рдХреЛрдб-рдмреЗрд╕ рдлреВрд▓рд╛ рд╣реБрдЖ рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рд╕реВрдЬрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо рд╣реИред рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рдЕрдкрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдмреИрдХрдмреЛрди рдЖрдкрдХреЛ рдРрд╕реЗ рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдлрд┐рд░ рд░рд╛рд╕реНрддреЗ рд╕реЗ рд╣рдЯ рдЬрд╛рддреЗ рд╣реИрдВред
@ g00fy- рдЖрдк рдЕрдкрдиреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдорд┐рдд-рд░рд╛рдЬреНрдп рдорд╢реАрди рд▓рд┐рдЦрдиреЗ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред Chaplin.js рдореЗрдВ рдПрдХ рд╣реИ рдЬрд┐рд╕реЗ рджреЛрд╣рд░рд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ ifandelse/machina.js рднреА рд╣реИ ( рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рджреЗрдЦреЗрдВ) рдЬреЛ рдЖрдкрдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@braddunbar , @caseywebdev рд╡рд┐рдЪрд╛рд░ рдЙрди рджреЛ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИред (рджреГрд╢реНрдп рдХрд┐рд╕реА рднреА рд░рд╛рдЬреНрдп рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдХреЗрд╡рд▓ _'рд╕реНрд╡рдЪреНрдЫ'_ рд╕рдВрдЧреНрд░рд╣)
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ
рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рджреГрд╢реНрдп рдХреЛ 'рдЕрдиреБрд░реЛрдз' рдФрд░ 'рд╕рд┐рдВрдХ' рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╕реБрдирдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╕рдВрдЧреНрд░рд╣ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рд╕рдВрдХреЗрдд рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдЗрд╕рд▓рд┐рдП рджреГрд╢реНрдп рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд░рд╣рд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рд╕рдВрдЧреНрд░рд╣ рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдпрд╛ рддреЛ _fetched_ , _fetching_ рдпрд╛ _unfetched_ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рджреГрд╢реНрдп рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ (tl: dr рдЙрджрд╛рд╣рд░рдг 3 рджреЗрдЦреЗрдВ) ред
рдЙрджрд╛рд╣рд░рдг 1 (рдЬрд╣рд╛рдВ рд╕рд┐рдЧреНрдирд▓ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ)
рдЙрджрд╛рд╣рд░рдг 2 (рджреГрд╢реНрдп рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рд╛рдкреНрдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдореНрдЯреА рд╕рдВрдЧреНрд░рд╣, рд╕рд┐рдЧреНрдирд▓ рднреА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ)
рдЙрджрд╛рд╣рд░рдг 3 (рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рд╕рд┐рдЧреНрдирд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ)
рджреГрд╢реНрдп рдпрд╣ рдирд╣реАрдВ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджрд┐ рд╕рдВрдЧреНрд░рд╣.рд▓рдВрдмрд╛рдИ == 0 рд╣реИ рддреЛ рдпрд╣ рдЕрдирдлрд╝реЗрдЪ рд╣реИред
рджреГрд╢реНрдп рдпрд╣ рднреА рдирд╣реАрдВ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдЕрдкреНрд░рд╛рдкреНрдд рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд░рд╛рдЬреНрдп рдореЗрдВ) рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрджрд┐ рд╣рдо рд╕рдВрдЧреНрд░рд╣ рдХреЛ рджреГрд╢реНрдп рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рджреГрд╢реНрдп рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИред
рд╡рд╣реА рдмрд╛рдд рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЬрд╛рддреА рд╣реИ