@azure-net/kit 0.6.7 → 0.8.1
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/dist/core/classMirror/ClassMirror.d.ts +3 -0
- package/dist/core/classMirror/ClassMirror.js +19 -0
- package/dist/core/classMirror/index.d.ts +1 -0
- package/dist/core/classMirror/index.js +1 -0
- package/dist/core/index.d.ts +6 -5
- package/dist/core/index.js +6 -5
- package/dist/core/infra/datasource/BaseDatasource.d.ts +16 -0
- package/dist/core/{datasource → infra/datasource}/BaseDatasource.js +0 -7
- package/dist/core/infra/resource/BaseResource.d.ts +10 -0
- package/dist/core/infra/resource/BaseResource.js +5 -0
- package/dist/core/infra/resource/index.d.ts +1 -0
- package/dist/core/infra/resource/index.js +1 -0
- package/dist/core/infra/response/BaseResponse.d.ts +34 -0
- package/dist/core/infra/response/BaseResponse.js +81 -0
- package/dist/core/provider/dependencies/ErrorHandler.d.ts +1 -1
- package/dist/core/provider/dependencies/ErrorHandler.js +1 -1
- package/dist/lib/eventModifiers/EventModifiers.d.ts +16 -5
- package/dist/lib/eventModifiers/EventModifiers.js +29 -20
- package/package.json +1 -1
- package/dist/core/appLayers/AppLayers.d.ts +0 -6
- package/dist/core/appLayers/AppLayers.js +0 -7
- package/dist/core/appLayers/index.d.ts +0 -1
- package/dist/core/appLayers/index.js +0 -1
- package/dist/core/application/ResourceService.d.ts +0 -11
- package/dist/core/application/ResourceService.js +0 -13
- package/dist/core/application/index.d.ts +0 -1
- package/dist/core/application/index.js +0 -1
- package/dist/core/datasource/BaseDatasource.d.ts +0 -35
- package/dist/core/response/BaseResponse.d.ts +0 -11
- package/dist/core/response/BaseResponse.js +0 -13
- /package/dist/core/{datasource → infra/datasource}/index.d.ts +0 -0
- /package/dist/core/{datasource → infra/datasource}/index.js +0 -0
- /package/dist/core/{httpService → infra/httpService}/HttpService.d.ts +0 -0
- /package/dist/core/{httpService → infra/httpService}/HttpService.js +0 -0
- /package/dist/core/{httpService → infra/httpService}/Statuses.d.ts +0 -0
- /package/dist/core/{httpService → infra/httpService}/Statuses.js +0 -0
- /package/dist/core/{httpService → infra/httpService}/index.d.ts +0 -0
- /package/dist/core/{httpService → infra/httpService}/index.js +0 -0
- /package/dist/core/{query → infra/query}/QueryBuilder.d.ts +0 -0
- /package/dist/core/{query → infra/query}/QueryBuilder.js +0 -0
- /package/dist/core/{query → infra/query}/index.d.ts +0 -0
- /package/dist/core/{query → infra/query}/index.js +0 -0
- /package/dist/core/{response → infra/response}/index.d.ts +0 -0
- /package/dist/core/{response → infra/response}/index.js +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export class ClassMirror {
|
|
2
|
+
constructor(target) {
|
|
3
|
+
const proto = Object.getPrototypeOf(target);
|
|
4
|
+
for (const name of Object.getOwnPropertyNames(proto)) {
|
|
5
|
+
if (name === 'constructor')
|
|
6
|
+
continue;
|
|
7
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, name);
|
|
8
|
+
if (!descriptor || typeof descriptor.value !== 'function')
|
|
9
|
+
continue;
|
|
10
|
+
if (name in this)
|
|
11
|
+
continue;
|
|
12
|
+
Object.defineProperty(this, name, {
|
|
13
|
+
value: descriptor.value.bind(target),
|
|
14
|
+
configurable: true,
|
|
15
|
+
writable: true
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ClassMirror.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ClassMirror.js';
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './httpService/index.js';
|
|
4
|
-
export * from './datasource/index.js';
|
|
1
|
+
export * from './infra/response/index.js';
|
|
2
|
+
export * from './infra/resource/index.js';
|
|
3
|
+
export * from './infra/httpService/index.js';
|
|
4
|
+
export * from './infra/datasource/index.js';
|
|
5
|
+
export * from './infra/query/index.js';
|
|
6
|
+
export * from './classMirror/index.js';
|
|
5
7
|
export * from './request/index.js';
|
|
6
|
-
export * from './query/index.js';
|
|
7
8
|
export * from './boundaryProvider/index.js';
|
package/dist/core/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './httpService/index.js';
|
|
4
|
-
export * from './datasource/index.js';
|
|
1
|
+
export * from './infra/response/index.js';
|
|
2
|
+
export * from './infra/resource/index.js';
|
|
3
|
+
export * from './infra/httpService/index.js';
|
|
4
|
+
export * from './infra/datasource/index.js';
|
|
5
|
+
export * from './infra/query/index.js';
|
|
6
|
+
export * from './classMirror/index.js';
|
|
5
7
|
export * from './request/index.js';
|
|
6
|
-
export * from './query/index.js';
|
|
7
8
|
export * from './boundaryProvider/index.js';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { HttpService, HttpServiceResponse } from '../httpService/HttpService.js';
|
|
2
|
+
import { QueryBuilder } from '../query/index.js';
|
|
3
|
+
export type CreateRequestCallbackType<T> = (params: {
|
|
4
|
+
http: HttpService;
|
|
5
|
+
query: QueryBuilder;
|
|
6
|
+
}) => Promise<HttpServiceResponse<T>>;
|
|
7
|
+
export declare class BaseHttpDatasource {
|
|
8
|
+
protected readonly httpClient: HttpService;
|
|
9
|
+
protected readonly query: QueryBuilder;
|
|
10
|
+
constructor(params: {
|
|
11
|
+
http?: HttpService;
|
|
12
|
+
query?: QueryBuilder;
|
|
13
|
+
});
|
|
14
|
+
private _createRawRequest;
|
|
15
|
+
readonly createRawRequest: <T>(callback: CreateRequestCallbackType<T>) => Promise<HttpServiceResponse<T>>;
|
|
16
|
+
}
|
|
@@ -7,13 +7,6 @@ export class BaseHttpDatasource {
|
|
|
7
7
|
this.httpClient = params.http ?? new HttpService({ baseUrl: '' });
|
|
8
8
|
this.query = params.query ?? new QueryBuilder();
|
|
9
9
|
}
|
|
10
|
-
async createRequest(callback) {
|
|
11
|
-
return await callback({ http: this.httpClient, query: this.query })
|
|
12
|
-
.then((response) => response)
|
|
13
|
-
.catch((err) => {
|
|
14
|
-
throw err;
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
10
|
async _createRawRequest(callback) {
|
|
18
11
|
return await callback({ http: this.httpClient, query: this.query }).catch((err) => {
|
|
19
12
|
throw err;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type PlainObject<T> = {
|
|
2
|
+
[K in keyof T as K extends string ? (T[K] extends (...args: unknown[]) => unknown ? never : K) : never]: T[K];
|
|
3
|
+
};
|
|
4
|
+
export interface IDTOMapper<TOutput = never> {
|
|
5
|
+
toPlainObject(): [TOutput] extends [never] ? PlainObject<this> : TOutput;
|
|
6
|
+
}
|
|
7
|
+
export type Collection<T> = T[];
|
|
8
|
+
export declare class DTOMapper<TOutput = never> implements IDTOMapper<TOutput> {
|
|
9
|
+
toPlainObject(): [TOutput] extends [never] ? PlainObject<this> : TOutput;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './BaseResource.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './BaseResource.js';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { HttpServiceResponse } from '../../index.js';
|
|
2
|
+
type DeepKeys<T> = T extends object ? {
|
|
3
|
+
[K in keyof T & string]: T[K] extends object ? K | `${K}.${DeepKeys<T[K]>}` : K;
|
|
4
|
+
}[keyof T & string] : never;
|
|
5
|
+
type DeepValue<T, Path extends string> = Path extends `${infer Key}.${infer Rest}` ? Key extends keyof T ? DeepValue<T[Key], Rest> : never : Path extends keyof T ? T[Path] : never;
|
|
6
|
+
type ResponseBuilderState<TData, TMeta = unknown> = {
|
|
7
|
+
data: TData;
|
|
8
|
+
meta: TMeta;
|
|
9
|
+
};
|
|
10
|
+
type ArrayElement<T> = T extends readonly (infer E)[] ? E : never;
|
|
11
|
+
export declare class ResponseBuilder<TData = unknown, TMeta = object, TWrapper = TData> {
|
|
12
|
+
protected readonly response: HttpServiceResponse<TWrapper>;
|
|
13
|
+
protected state: ResponseBuilderState<TData, TMeta>;
|
|
14
|
+
constructor(response: HttpServiceResponse<TWrapper>);
|
|
15
|
+
protected unwrapData(data: TWrapper): TData;
|
|
16
|
+
mapUsing<TResource>(ResourceClass: new (data: TData) => {
|
|
17
|
+
toPlainObject(): TResource;
|
|
18
|
+
}): ResponseBuilder<TResource, TMeta, TWrapper>;
|
|
19
|
+
mapCollectionUsing<TResource>(ResourceClass: new (data: ArrayElement<TData>) => {
|
|
20
|
+
toPlainObject(): TResource;
|
|
21
|
+
}): ResponseBuilder<TResource[], TMeta, TWrapper>;
|
|
22
|
+
extract<TPath extends DeepKeys<TData>>(path: TPath): ResponseBuilder<DeepValue<TData, TPath>, TMeta, TWrapper>;
|
|
23
|
+
addMeta<TNewMeta extends Record<string, unknown>>(metaData: TNewMeta | ((current: TMeta) => TNewMeta)): ResponseBuilder<TData, TMeta & TNewMeta, TWrapper>;
|
|
24
|
+
getData(): TData;
|
|
25
|
+
get(): {
|
|
26
|
+
data: TData;
|
|
27
|
+
meta: TMeta;
|
|
28
|
+
};
|
|
29
|
+
getFlatten(): {
|
|
30
|
+
data: TData;
|
|
31
|
+
} & TMeta;
|
|
32
|
+
getRaw(): HttpServiceResponse<TWrapper>;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { HttpServiceResponse } from '../../index.js';
|
|
2
|
+
export class ResponseBuilder {
|
|
3
|
+
response;
|
|
4
|
+
state;
|
|
5
|
+
constructor(response) {
|
|
6
|
+
this.response = response;
|
|
7
|
+
this.state = {
|
|
8
|
+
data: this.unwrapData(response.data),
|
|
9
|
+
meta: {}
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
unwrapData(data) {
|
|
13
|
+
return data;
|
|
14
|
+
}
|
|
15
|
+
mapUsing(ResourceClass) {
|
|
16
|
+
const resource = new ResourceClass(this.state.data);
|
|
17
|
+
const newResponse = new ResponseBuilder(this.response);
|
|
18
|
+
newResponse.state = {
|
|
19
|
+
...this.state,
|
|
20
|
+
data: resource.toPlainObject()
|
|
21
|
+
};
|
|
22
|
+
return newResponse;
|
|
23
|
+
}
|
|
24
|
+
mapCollectionUsing(ResourceClass) {
|
|
25
|
+
if (!Array.isArray(this.state.data)) {
|
|
26
|
+
throw new Error('toCollection can only be used when data is an array');
|
|
27
|
+
}
|
|
28
|
+
const collection = this.state.data.map((dataElement) => new ResourceClass(dataElement).toPlainObject());
|
|
29
|
+
const newResponse = new ResponseBuilder(this.response);
|
|
30
|
+
newResponse.state = {
|
|
31
|
+
...this.state,
|
|
32
|
+
data: collection
|
|
33
|
+
};
|
|
34
|
+
return newResponse;
|
|
35
|
+
}
|
|
36
|
+
extract(path) {
|
|
37
|
+
const keys = path.split('.');
|
|
38
|
+
let result = this.state.data;
|
|
39
|
+
for (const key of keys) {
|
|
40
|
+
if (result && typeof result === 'object' && key in result) {
|
|
41
|
+
result = result[key];
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
throw new Error(`Path "${path}" not found in response data`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const newResponse = new ResponseBuilder(this.response);
|
|
48
|
+
newResponse.state = {
|
|
49
|
+
...this.state,
|
|
50
|
+
data: result
|
|
51
|
+
};
|
|
52
|
+
return newResponse;
|
|
53
|
+
}
|
|
54
|
+
addMeta(metaData) {
|
|
55
|
+
const newMeta = typeof metaData === 'function' ? metaData(this.state.meta) : metaData;
|
|
56
|
+
const newResponse = new ResponseBuilder(this.response);
|
|
57
|
+
newResponse.state = {
|
|
58
|
+
...this.state,
|
|
59
|
+
meta: { ...this.state.meta, ...newMeta }
|
|
60
|
+
};
|
|
61
|
+
return newResponse;
|
|
62
|
+
}
|
|
63
|
+
getData() {
|
|
64
|
+
return this.state.data;
|
|
65
|
+
}
|
|
66
|
+
get() {
|
|
67
|
+
return {
|
|
68
|
+
data: this.state.data,
|
|
69
|
+
meta: this.state.meta
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
getFlatten() {
|
|
73
|
+
return {
|
|
74
|
+
data: this.state.data,
|
|
75
|
+
...this.state.meta
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
getRaw() {
|
|
79
|
+
return this.response;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseRequest, type RequestErrors } from '../../request/index.js';
|
|
2
|
-
import { HttpServiceError } from '../../httpService/index.js';
|
|
2
|
+
import { HttpServiceError } from '../../infra/httpService/index.js';
|
|
3
3
|
export type AppErrorType = 'http' | 'request' | 'app' | 'abort';
|
|
4
4
|
export interface AppError<T = unknown, D = never> {
|
|
5
5
|
type: AppErrorType;
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
export type EventHandler<E = Event> = (event: E) => void;
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
interface EventModifier<E extends Event = Event> {
|
|
3
|
+
(fn: () => void): EventHandler<E>;
|
|
4
|
+
prevent: EventModifier<E>;
|
|
5
|
+
stop: EventModifier<E>;
|
|
6
|
+
immediate: EventModifier<E>;
|
|
7
|
+
once: EventModifier<E>;
|
|
8
|
+
preventDefault: EventModifier<E>;
|
|
9
|
+
stopPropagation: EventModifier<E>;
|
|
10
|
+
stopImmediatePropagation: EventModifier<E>;
|
|
11
|
+
}
|
|
12
|
+
export declare const prevent: EventModifier<Event>;
|
|
13
|
+
export declare const stop: EventModifier<Event>;
|
|
14
|
+
export declare const immediate: EventModifier<Event>;
|
|
15
|
+
export declare const once: EventModifier<Event>;
|
|
16
|
+
export declare const event: EventModifier<Event>;
|
|
17
|
+
export {};
|
|
@@ -1,22 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
const createEventModifier = (modifiers = new Set()) => {
|
|
2
|
+
return new Proxy(() => { }, {
|
|
3
|
+
get(_, prop) {
|
|
4
|
+
return createEventModifier(new Set([...modifiers, prop]));
|
|
5
|
+
},
|
|
6
|
+
apply(_, __, [fn]) {
|
|
7
|
+
let executed = false;
|
|
8
|
+
return (event) => {
|
|
9
|
+
if (modifiers.has('once') && executed)
|
|
10
|
+
return;
|
|
11
|
+
if (modifiers.has('prevent') || modifiers.has('preventDefault')) {
|
|
12
|
+
event.preventDefault();
|
|
13
|
+
}
|
|
14
|
+
if (modifiers.has('stop') || modifiers.has('stopPropagation')) {
|
|
15
|
+
event.stopPropagation();
|
|
16
|
+
}
|
|
17
|
+
if (modifiers.has('immediate') || modifiers.has('stopImmediatePropagation')) {
|
|
18
|
+
event.stopImmediatePropagation();
|
|
19
|
+
}
|
|
20
|
+
if (modifiers.has('once'))
|
|
21
|
+
executed = true;
|
|
22
|
+
fn();
|
|
23
|
+
};
|
|
19
24
|
}
|
|
20
|
-
};
|
|
25
|
+
});
|
|
21
26
|
};
|
|
22
|
-
export const
|
|
27
|
+
export const prevent = createEventModifier(new Set(['prevent']));
|
|
28
|
+
export const stop = createEventModifier(new Set(['stop']));
|
|
29
|
+
export const immediate = createEventModifier(new Set(['immediate']));
|
|
30
|
+
export const once = createEventModifier(new Set(['once']));
|
|
31
|
+
export const event = createEventModifier();
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './AppLayers.js';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './AppLayers.js';
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { HttpServiceResponse } from '../httpService/index.js';
|
|
2
|
-
export declare class ResourceService {
|
|
3
|
-
protected transformResponse<TData extends object, TResult = TData, TKey extends keyof TData | undefined = undefined>(requestPromise: Promise<HttpServiceResponse<TData>>, options?: {
|
|
4
|
-
responseModel?: {
|
|
5
|
-
new (response: HttpServiceResponse<TData>): {
|
|
6
|
-
json(): TResult;
|
|
7
|
-
};
|
|
8
|
-
};
|
|
9
|
-
key?: TKey;
|
|
10
|
-
}): Promise<TKey extends keyof TData ? TData[TKey] : TResult>;
|
|
11
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { HttpServiceResponse } from '../httpService/index.js';
|
|
2
|
-
export class ResourceService {
|
|
3
|
-
async transformResponse(requestPromise, options) {
|
|
4
|
-
const response = await requestPromise;
|
|
5
|
-
if (options?.responseModel) {
|
|
6
|
-
return new options.responseModel(response).json();
|
|
7
|
-
}
|
|
8
|
-
if (options?.key) {
|
|
9
|
-
return response.data[options.key];
|
|
10
|
-
}
|
|
11
|
-
return response.data;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './ResourceService.js';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './ResourceService.js';
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { HttpService, HttpServiceResponse } from '../httpService/HttpService.js';
|
|
2
|
-
import { QueryBuilder } from '../query/index.js';
|
|
3
|
-
export interface IDatasource {
|
|
4
|
-
/**
|
|
5
|
-
* Executes a wrapped HTTP request and handles the response.
|
|
6
|
-
*
|
|
7
|
-
* @param callback - A function that receives the HttpService and returns a Promise of a response.
|
|
8
|
-
* @returns A typed HTTP response wrapped in a Promise.
|
|
9
|
-
*/
|
|
10
|
-
createRequest<T>(callback: <J = T>(params: {
|
|
11
|
-
http: HttpService;
|
|
12
|
-
query: QueryBuilder;
|
|
13
|
-
}) => Promise<HttpServiceResponse<J>>): Promise<HttpServiceResponse<T>>;
|
|
14
|
-
createRawRequest<T>(callback: (params: {
|
|
15
|
-
http: HttpService;
|
|
16
|
-
query: QueryBuilder;
|
|
17
|
-
}) => Promise<HttpServiceResponse<T>>): Promise<HttpServiceResponse<T>>;
|
|
18
|
-
}
|
|
19
|
-
export declare class BaseHttpDatasource implements IDatasource {
|
|
20
|
-
protected readonly httpClient: HttpService;
|
|
21
|
-
protected readonly query: QueryBuilder;
|
|
22
|
-
constructor(params: {
|
|
23
|
-
http?: HttpService;
|
|
24
|
-
query?: QueryBuilder;
|
|
25
|
-
});
|
|
26
|
-
createRequest<T>(callback: <J = T>(params: {
|
|
27
|
-
http: HttpService;
|
|
28
|
-
query: QueryBuilder;
|
|
29
|
-
}) => Promise<HttpServiceResponse<J>>): Promise<HttpServiceResponse<T>>;
|
|
30
|
-
private _createRawRequest;
|
|
31
|
-
readonly createRawRequest: <T>(callback: (params: {
|
|
32
|
-
http: HttpService;
|
|
33
|
-
query: QueryBuilder;
|
|
34
|
-
}) => Promise<HttpServiceResponse<T>>) => Promise<HttpServiceResponse<T>>;
|
|
35
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { HttpServiceResponse } from '../httpService/index.js';
|
|
2
|
-
export interface IBaseResponse<T, D = T> {
|
|
3
|
-
transform(data: HttpServiceResponse<T>): D;
|
|
4
|
-
json(): D;
|
|
5
|
-
}
|
|
6
|
-
export declare class BaseResponse<T, D = T> implements IBaseResponse<T, D> {
|
|
7
|
-
protected response: HttpServiceResponse<T>;
|
|
8
|
-
constructor(response: HttpServiceResponse<T>);
|
|
9
|
-
transform(response: HttpServiceResponse<T>): D;
|
|
10
|
-
json(): D;
|
|
11
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { HttpServiceResponse } from '../httpService/index.js';
|
|
2
|
-
export class BaseResponse {
|
|
3
|
-
response;
|
|
4
|
-
constructor(response) {
|
|
5
|
-
this.response = response;
|
|
6
|
-
}
|
|
7
|
-
transform(response) {
|
|
8
|
-
return response.data;
|
|
9
|
-
}
|
|
10
|
-
json() {
|
|
11
|
-
return this.transform(this.response);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
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
|
|
File without changes
|
|
File without changes
|