ts-ioc-container 26.4.5 → 26.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -31
- package/cjm/container/AutoMockedContainer.js +2 -2
- package/cjm/container/Container.js +1 -1
- package/cjm/container/EmptyContainer.js +2 -2
- package/cjm/index.js +5 -7
- package/cjm/{registration → provider}/Registration.js +2 -6
- package/esm/container/AutoMockedContainer.js +2 -2
- package/esm/container/Container.js +1 -1
- package/esm/container/EmptyContainer.js +2 -2
- package/esm/index.js +4 -5
- package/esm/{registration → provider}/Registration.js +2 -6
- package/package.json +2 -2
- package/typings/index.d.ts +4 -5
- package/typings/{registration → provider}/Registration.d.ts +1 -1
- /package/cjm/{container → errors}/ContainerDisposedError.js +0 -0
- /package/cjm/{registration → errors}/DependencyMissingKeyError.js +0 -0
- /package/cjm/{container → errors}/DependencyNotFoundError.js +0 -0
- /package/cjm/{container → errors}/MethodNotImplementedError.js +0 -0
- /package/esm/{container → errors}/ContainerDisposedError.js +0 -0
- /package/esm/{registration → errors}/DependencyMissingKeyError.js +0 -0
- /package/esm/{container → errors}/DependencyNotFoundError.js +0 -0
- /package/esm/{container → errors}/MethodNotImplementedError.js +0 -0
- /package/typings/{container → errors}/ContainerDisposedError.d.ts +0 -0
- /package/typings/{registration → errors}/DependencyMissingKeyError.d.ts +0 -0
- /package/typings/{container → errors}/DependencyNotFoundError.d.ts +0 -0
- /package/typings/{container → errors}/MethodNotImplementedError.d.ts +0 -0
package/README.md
CHANGED
|
@@ -81,11 +81,11 @@ import 'reflect-metadata';
|
|
|
81
81
|
import { IContainer, by, Container, inject, ReflectionInjector, Provider } from 'ts-ioc-container';
|
|
82
82
|
|
|
83
83
|
describe('Basic usage', function () {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
84
|
+
class Logger {
|
|
85
|
+
name = 'Logger';
|
|
86
|
+
}
|
|
88
87
|
|
|
88
|
+
it('should inject dependencies', function () {
|
|
89
89
|
class App {
|
|
90
90
|
constructor(@inject(by.key('ILogger')) public logger: Logger) {}
|
|
91
91
|
}
|
|
@@ -95,6 +95,18 @@ describe('Basic usage', function () {
|
|
|
95
95
|
expect(container.resolve(App).logger.name).toBe('Logger');
|
|
96
96
|
});
|
|
97
97
|
|
|
98
|
+
it('should inject multiple dependencies', function () {
|
|
99
|
+
class App {
|
|
100
|
+
constructor(@inject(by.keys('ILogger1', 'ILogger2')) public loggers: Logger[]) {}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const container = new Container(new ReflectionInjector())
|
|
104
|
+
.register('ILogger1', Provider.fromClass(Logger))
|
|
105
|
+
.register('ILogger2', Provider.fromClass(Logger));
|
|
106
|
+
|
|
107
|
+
expect(container.resolve(App).loggers).toHaveLength(2);
|
|
108
|
+
});
|
|
109
|
+
|
|
98
110
|
it('should inject current scope', function () {
|
|
99
111
|
const root = new Container(new ReflectionInjector(), { tags: ['root'] });
|
|
100
112
|
|
|
@@ -539,51 +551,68 @@ Sometimes you want to register the same provider with different keys. This is wh
|
|
|
539
551
|
|
|
540
552
|
```typescript
|
|
541
553
|
import 'reflect-metadata';
|
|
542
|
-
import { alias, by, Container, inject,
|
|
554
|
+
import { alias, by, Container, inject, provider, ReflectionInjector, Registration } from 'ts-ioc-container';
|
|
543
555
|
|
|
544
556
|
describe('alias', () => {
|
|
545
|
-
|
|
546
|
-
|
|
557
|
+
const IMiddlewareKey = Symbol('IMiddleware');
|
|
558
|
+
const middleware = provider(alias(IMiddlewareKey));
|
|
559
|
+
|
|
560
|
+
interface IMiddleware {
|
|
561
|
+
applyTo(application: IApplication): void;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
interface IApplication {
|
|
565
|
+
use(module: IMiddleware): void;
|
|
566
|
+
markMiddlewareAsApplied(name: string): void;
|
|
547
567
|
}
|
|
548
568
|
|
|
549
|
-
@
|
|
550
|
-
class
|
|
551
|
-
|
|
569
|
+
@middleware
|
|
570
|
+
class LoggerMiddleware implements IMiddleware {
|
|
571
|
+
applyTo(application: IApplication): void {
|
|
572
|
+
application.markMiddlewareAsApplied('LoggerMiddleware');
|
|
573
|
+
}
|
|
552
574
|
}
|
|
553
575
|
|
|
554
|
-
@
|
|
555
|
-
class
|
|
556
|
-
|
|
576
|
+
@middleware
|
|
577
|
+
class ErrorHandlerMiddleware implements IMiddleware {
|
|
578
|
+
applyTo(application: IApplication): void {
|
|
579
|
+
application.markMiddlewareAsApplied('ErrorHandlerMiddleware');
|
|
580
|
+
}
|
|
557
581
|
}
|
|
558
582
|
|
|
559
583
|
it('should resolve by some alias', () => {
|
|
560
|
-
class App {
|
|
561
|
-
|
|
562
|
-
|
|
584
|
+
class App implements IApplication {
|
|
585
|
+
private appliedMiddleware: Set<string> = new Set();
|
|
586
|
+
constructor(@inject(by.alias.some(IMiddlewareKey)) public middleware: IMiddleware[]) {}
|
|
563
587
|
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
588
|
+
markMiddlewareAsApplied(name: string): void {
|
|
589
|
+
this.appliedMiddleware.add(name);
|
|
590
|
+
}
|
|
567
591
|
|
|
568
|
-
|
|
592
|
+
isMiddlewareApplied(name: string): boolean {
|
|
593
|
+
return this.appliedMiddleware.has(name);
|
|
594
|
+
}
|
|
569
595
|
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
596
|
+
use(module: IMiddleware): void {
|
|
597
|
+
module.applyTo(this);
|
|
598
|
+
}
|
|
573
599
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
600
|
+
run() {
|
|
601
|
+
for (const module of this.middleware) {
|
|
602
|
+
module.applyTo(this);
|
|
603
|
+
}
|
|
604
|
+
}
|
|
577
605
|
}
|
|
578
606
|
|
|
579
607
|
const container = new Container(new ReflectionInjector())
|
|
580
|
-
.
|
|
581
|
-
.
|
|
608
|
+
.use(Registration.fromClass(LoggerMiddleware))
|
|
609
|
+
.use(Registration.fromClass(ErrorHandlerMiddleware));
|
|
582
610
|
|
|
583
611
|
const app = container.resolve(App);
|
|
612
|
+
app.run();
|
|
584
613
|
|
|
585
|
-
expect(app.
|
|
586
|
-
expect(app.
|
|
614
|
+
expect(app.isMiddlewareApplied('LoggerMiddleware')).toBe(true);
|
|
615
|
+
expect(app.isMiddlewareApplied('ErrorHandlerMiddleware')).toBe(true);
|
|
587
616
|
});
|
|
588
617
|
});
|
|
589
618
|
|
|
@@ -826,7 +855,6 @@ describe('Mocking', () => {
|
|
|
826
855
|
## Errors
|
|
827
856
|
|
|
828
857
|
- [DependencyNotFoundError.ts](lib%2Fcontainer%2FDependencyNotFoundError.ts)
|
|
829
|
-
- [DependencyMissingKeyError.ts](lib%2Fregistration%2FDependencyMissingKeyError.ts)
|
|
830
858
|
- [MethodNotImplementedError.ts](lib%2FMethodNotImplementedError.ts)
|
|
831
859
|
- [ContainerDisposedError.ts](lib%2Fcontainer%2FContainerDisposedError.ts)
|
|
832
860
|
|
|
@@ -11,14 +11,14 @@ class AutoMockedContainer {
|
|
|
11
11
|
}
|
|
12
12
|
dispose() { }
|
|
13
13
|
register() {
|
|
14
|
-
|
|
14
|
+
return this;
|
|
15
15
|
}
|
|
16
16
|
getInstances() {
|
|
17
17
|
return [];
|
|
18
18
|
}
|
|
19
19
|
removeScope() { }
|
|
20
20
|
use() {
|
|
21
|
-
|
|
21
|
+
return this;
|
|
22
22
|
}
|
|
23
23
|
getAllProviders() {
|
|
24
24
|
return new Map();
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Container = void 0;
|
|
4
4
|
const IContainer_1 = require("./IContainer");
|
|
5
5
|
const EmptyContainer_1 = require("./EmptyContainer");
|
|
6
|
-
const ContainerDisposedError_1 = require("
|
|
6
|
+
const ContainerDisposedError_1 = require("../errors/ContainerDisposedError");
|
|
7
7
|
class Container {
|
|
8
8
|
constructor(injector, options = {}) {
|
|
9
9
|
var _a, _b;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.EmptyContainer = void 0;
|
|
4
|
-
const MethodNotImplementedError_1 = require("
|
|
5
|
-
const DependencyNotFoundError_1 = require("
|
|
4
|
+
const MethodNotImplementedError_1 = require("../errors/MethodNotImplementedError");
|
|
5
|
+
const DependencyNotFoundError_1 = require("../errors/DependencyNotFoundError");
|
|
6
6
|
class EmptyContainer {
|
|
7
7
|
getTokensByProvider() {
|
|
8
8
|
return [];
|
package/cjm/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getMetadata = exports.setMetadata = exports.by = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.ReflectionInjector = exports.
|
|
3
|
+
exports.getMetadata = exports.setMetadata = exports.by = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.ReflectionInjector = exports.Registration = exports.key = exports.AutoMockedContainer = exports.TaggedProvider = exports.tags = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.provider = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.alias = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
|
|
4
4
|
var IContainer_1 = require("./container/IContainer");
|
|
5
5
|
Object.defineProperty(exports, "isDependencyKey", { enumerable: true, get: function () { return IContainer_1.isDependencyKey; } });
|
|
6
6
|
var Container_1 = require("./container/Container");
|
|
@@ -9,11 +9,11 @@ var EmptyContainer_1 = require("./container/EmptyContainer");
|
|
|
9
9
|
Object.defineProperty(exports, "EmptyContainer", { enumerable: true, get: function () { return EmptyContainer_1.EmptyContainer; } });
|
|
10
10
|
var IProvider_1 = require("./provider/IProvider");
|
|
11
11
|
Object.defineProperty(exports, "alias", { enumerable: true, get: function () { return IProvider_1.alias; } });
|
|
12
|
-
var DependencyNotFoundError_1 = require("./
|
|
12
|
+
var DependencyNotFoundError_1 = require("./errors/DependencyNotFoundError");
|
|
13
13
|
Object.defineProperty(exports, "DependencyNotFoundError", { enumerable: true, get: function () { return DependencyNotFoundError_1.DependencyNotFoundError; } });
|
|
14
|
-
var MethodNotImplementedError_1 = require("./
|
|
14
|
+
var MethodNotImplementedError_1 = require("./errors/MethodNotImplementedError");
|
|
15
15
|
Object.defineProperty(exports, "MethodNotImplementedError", { enumerable: true, get: function () { return MethodNotImplementedError_1.MethodNotImplementedError; } });
|
|
16
|
-
var ContainerDisposedError_1 = require("./
|
|
16
|
+
var ContainerDisposedError_1 = require("./errors/ContainerDisposedError");
|
|
17
17
|
Object.defineProperty(exports, "ContainerDisposedError", { enumerable: true, get: function () { return ContainerDisposedError_1.ContainerDisposedError; } });
|
|
18
18
|
var Provider_1 = require("./provider/Provider");
|
|
19
19
|
Object.defineProperty(exports, "Provider", { enumerable: true, get: function () { return Provider_1.Provider; } });
|
|
@@ -30,11 +30,9 @@ Object.defineProperty(exports, "tags", { enumerable: true, get: function () { re
|
|
|
30
30
|
Object.defineProperty(exports, "TaggedProvider", { enumerable: true, get: function () { return TaggedProvider_1.TaggedProvider; } });
|
|
31
31
|
var AutoMockedContainer_1 = require("./container/AutoMockedContainer");
|
|
32
32
|
Object.defineProperty(exports, "AutoMockedContainer", { enumerable: true, get: function () { return AutoMockedContainer_1.AutoMockedContainer; } });
|
|
33
|
-
var Registration_1 = require("./
|
|
33
|
+
var Registration_1 = require("./provider/Registration");
|
|
34
34
|
Object.defineProperty(exports, "key", { enumerable: true, get: function () { return Registration_1.key; } });
|
|
35
35
|
Object.defineProperty(exports, "Registration", { enumerable: true, get: function () { return Registration_1.Registration; } });
|
|
36
|
-
var DependencyMissingKeyError_1 = require("./registration/DependencyMissingKeyError");
|
|
37
|
-
Object.defineProperty(exports, "DependencyMissingKeyError", { enumerable: true, get: function () { return DependencyMissingKeyError_1.DependencyMissingKeyError; } });
|
|
38
36
|
var ReflectionInjector_1 = require("./injector/ReflectionInjector");
|
|
39
37
|
Object.defineProperty(exports, "ReflectionInjector", { enumerable: true, get: function () { return ReflectionInjector_1.ReflectionInjector; } });
|
|
40
38
|
Object.defineProperty(exports, "inject", { enumerable: true, get: function () { return ReflectionInjector_1.inject; } });
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Registration = exports.key = void 0;
|
|
4
|
-
const DependencyMissingKeyError_1 = require("./DependencyMissingKeyError");
|
|
5
4
|
const metadata_1 = require("../metadata");
|
|
6
|
-
const Provider_1 = require("
|
|
5
|
+
const Provider_1 = require("./Provider");
|
|
7
6
|
const DEPENDENCY_KEY = 'DependencyKey';
|
|
8
7
|
const key = (value) => (0, metadata_1.setMetadata)(DEPENDENCY_KEY, value);
|
|
9
8
|
exports.key = key;
|
|
@@ -14,10 +13,7 @@ class Registration {
|
|
|
14
13
|
}
|
|
15
14
|
static fromClass(Target) {
|
|
16
15
|
const dependencyKey = (0, metadata_1.getMetadata)(Target, DEPENDENCY_KEY);
|
|
17
|
-
|
|
18
|
-
throw new DependencyMissingKeyError_1.DependencyMissingKeyError(`Pls provide dependency key for ${Target.name}`);
|
|
19
|
-
}
|
|
20
|
-
return new Registration(dependencyKey, Provider_1.Provider.fromClass(Target));
|
|
16
|
+
return new Registration(dependencyKey !== null && dependencyKey !== void 0 ? dependencyKey : Target.name, Provider_1.Provider.fromClass(Target));
|
|
21
17
|
}
|
|
22
18
|
pipe(...mappers) {
|
|
23
19
|
this.provider = this.provider.pipe(...mappers);
|
|
@@ -8,14 +8,14 @@ export class AutoMockedContainer {
|
|
|
8
8
|
}
|
|
9
9
|
dispose() { }
|
|
10
10
|
register() {
|
|
11
|
-
|
|
11
|
+
return this;
|
|
12
12
|
}
|
|
13
13
|
getInstances() {
|
|
14
14
|
return [];
|
|
15
15
|
}
|
|
16
16
|
removeScope() { }
|
|
17
17
|
use() {
|
|
18
|
-
|
|
18
|
+
return this;
|
|
19
19
|
}
|
|
20
20
|
getAllProviders() {
|
|
21
21
|
return new Map();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isConstructor } from './IContainer';
|
|
2
2
|
import { EmptyContainer } from './EmptyContainer';
|
|
3
|
-
import { ContainerDisposedError } from '
|
|
3
|
+
import { ContainerDisposedError } from '../errors/ContainerDisposedError';
|
|
4
4
|
export class Container {
|
|
5
5
|
constructor(injector, options = {}) {
|
|
6
6
|
var _a, _b;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { MethodNotImplementedError } from '
|
|
2
|
-
import { DependencyNotFoundError } from '
|
|
1
|
+
import { MethodNotImplementedError } from '../errors/MethodNotImplementedError';
|
|
2
|
+
import { DependencyNotFoundError } from '../errors/DependencyNotFoundError';
|
|
3
3
|
export class EmptyContainer {
|
|
4
4
|
getTokensByProvider() {
|
|
5
5
|
return [];
|
package/esm/index.js
CHANGED
|
@@ -2,16 +2,15 @@ export { isDependencyKey, } from './container/IContainer';
|
|
|
2
2
|
export { Container } from './container/Container';
|
|
3
3
|
export { EmptyContainer } from './container/EmptyContainer';
|
|
4
4
|
export { alias } from './provider/IProvider';
|
|
5
|
-
export { DependencyNotFoundError } from './
|
|
6
|
-
export { MethodNotImplementedError } from './
|
|
7
|
-
export { ContainerDisposedError } from './
|
|
5
|
+
export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
|
|
6
|
+
export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
|
|
7
|
+
export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
8
8
|
export { Provider, provider } from './provider/Provider';
|
|
9
9
|
export { argsFn, args, ArgsProvider } from './provider/ArgsProvider';
|
|
10
10
|
export { singleton, SingletonProvider } from './provider/SingletonProvider';
|
|
11
11
|
export { tags, TaggedProvider } from './provider/TaggedProvider';
|
|
12
12
|
export { AutoMockedContainer } from './container/AutoMockedContainer';
|
|
13
|
-
export { key, Registration } from './
|
|
14
|
-
export { DependencyMissingKeyError } from './registration/DependencyMissingKeyError';
|
|
13
|
+
export { key, Registration } from './provider/Registration';
|
|
15
14
|
export { ReflectionInjector, inject } from './injector/ReflectionInjector';
|
|
16
15
|
export { SimpleInjector } from './injector/SimpleInjector';
|
|
17
16
|
export { ProxyInjector } from './injector/ProxyInjector';
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { DependencyMissingKeyError } from './DependencyMissingKeyError';
|
|
2
1
|
import { getMetadata, setMetadata } from '../metadata';
|
|
3
|
-
import { Provider } from '
|
|
2
|
+
import { Provider } from './Provider';
|
|
4
3
|
const DEPENDENCY_KEY = 'DependencyKey';
|
|
5
4
|
export const key = (value) => setMetadata(DEPENDENCY_KEY, value);
|
|
6
5
|
export class Registration {
|
|
@@ -10,10 +9,7 @@ export class Registration {
|
|
|
10
9
|
}
|
|
11
10
|
static fromClass(Target) {
|
|
12
11
|
const dependencyKey = getMetadata(Target, DEPENDENCY_KEY);
|
|
13
|
-
|
|
14
|
-
throw new DependencyMissingKeyError(`Pls provide dependency key for ${Target.name}`);
|
|
15
|
-
}
|
|
16
|
-
return new Registration(dependencyKey, Provider.fromClass(Target));
|
|
12
|
+
return new Registration(dependencyKey !== null && dependencyKey !== void 0 ? dependencyKey : Target.name, Provider.fromClass(Target));
|
|
17
13
|
}
|
|
18
14
|
pipe(...mappers) {
|
|
19
15
|
this.provider = this.provider.pipe(...mappers);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-ioc-container",
|
|
3
|
-
"version": "26.
|
|
3
|
+
"version": "26.5.0",
|
|
4
4
|
"description": "Typescript IoC container",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -60,5 +60,5 @@
|
|
|
60
60
|
"ts-node": "^10.9.1",
|
|
61
61
|
"typescript": "4.4.3"
|
|
62
62
|
},
|
|
63
|
-
"gitHead": "
|
|
63
|
+
"gitHead": "24de2212259dc0b0e564d1844dc5eb52244e5798"
|
|
64
64
|
}
|
package/typings/index.d.ts
CHANGED
|
@@ -4,16 +4,15 @@ export { Container } from './container/Container';
|
|
|
4
4
|
export { EmptyContainer } from './container/EmptyContainer';
|
|
5
5
|
export { ResolveDependency, IProvider, alias } from './provider/IProvider';
|
|
6
6
|
export { IInjector } from './injector/IInjector';
|
|
7
|
-
export { DependencyNotFoundError } from './
|
|
8
|
-
export { MethodNotImplementedError } from './
|
|
9
|
-
export { ContainerDisposedError } from './
|
|
7
|
+
export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
|
|
8
|
+
export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
|
|
9
|
+
export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
10
10
|
export { Provider, provider } from './provider/Provider';
|
|
11
11
|
export { ArgsFn, argsFn, args, ArgsProvider } from './provider/ArgsProvider';
|
|
12
12
|
export { singleton, SingletonProvider } from './provider/SingletonProvider';
|
|
13
13
|
export { tags, TaggedProvider } from './provider/TaggedProvider';
|
|
14
14
|
export { AutoMockedContainer } from './container/AutoMockedContainer';
|
|
15
|
-
export { key, Registration } from './
|
|
16
|
-
export { DependencyMissingKeyError } from './registration/DependencyMissingKeyError';
|
|
15
|
+
export { key, Registration } from './provider/Registration';
|
|
17
16
|
export { ReflectionInjector, inject } from './injector/ReflectionInjector';
|
|
18
17
|
export { SimpleInjector } from './injector/SimpleInjector';
|
|
19
18
|
export { ProxyInjector } from './injector/ProxyInjector';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DependencyKey, IContainer, IContainerModule } from '../container/IContainer';
|
|
2
2
|
import { constructor, MapFn } from '../utils';
|
|
3
|
-
import { IProvider } from '
|
|
3
|
+
import { IProvider } from './IProvider';
|
|
4
4
|
export declare const key: (value: DependencyKey) => ClassDecorator;
|
|
5
5
|
export declare class Registration implements IContainerModule {
|
|
6
6
|
private key;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|